{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "from exp.nb_06 import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ConvNet"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's get the data and training interface from where we left in the last notebook."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=5899)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train,y_train,x_valid,y_valid = get_data()\n",
    "\n",
    "x_train,x_valid = normalize_to(x_train,x_valid)\n",
    "train_ds,valid_ds = Dataset(x_train, y_train),Dataset(x_valid, y_valid)\n",
    "\n",
    "nh,bs = 50,512\n",
    "c = y_train.max().item()+1\n",
    "loss_func = F.cross_entropy\n",
    "\n",
    "data = DataBunch(*get_dls(train_ds, valid_ds, bs), c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist_view = view_tfm(1,28,28)\n",
    "cbfs = [Recorder,\n",
    "        partial(AvgStatsCallback,accuracy),\n",
    "        CudaCallback,\n",
    "        partial(BatchTransformXCallback, mnist_view)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "nfs = [8,16,32,64,64]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.4, conv_layer, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [1.024234921875, tensor(0.6730, device='cuda:0')]\n",
      "valid: [0.2444910400390625, tensor(0.9262, device='cuda:0')]\n",
      "train: [0.162599970703125, tensor(0.9502, device='cuda:0')]\n",
      "valid: [0.10074585571289063, tensor(0.9698, device='cuda:0')]\n",
      "CPU times: user 3.78 s, sys: 1.61 s, total: 5.39 s\n",
      "Wall time: 6.37 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(2, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Batchnorm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Custom"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start by building our own `BatchNorm` layer from scratch."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=6018)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class BatchNorm(nn.Module):\n",
    "    def __init__(self, nf, mom=0.1, eps=1e-5):\n",
    "        super().__init__()\n",
    "        # NB: pytorch bn mom is opposite of what you'd expect\n",
    "        self.mom,self.eps = mom,eps\n",
    "        self.mults = nn.Parameter(torch.ones (nf,1,1))\n",
    "        self.adds  = nn.Parameter(torch.zeros(nf,1,1))\n",
    "        self.register_buffer('vars',  torch.ones(1,nf,1,1))\n",
    "        self.register_buffer('means', torch.zeros(1,nf,1,1))\n",
    "\n",
    "    def update_stats(self, x):\n",
    "        m = x.mean((0,2,3), keepdim=True)\n",
    "        v = x.var ((0,2,3), keepdim=True)\n",
    "        self.means.lerp_(m, self.mom)\n",
    "        self.vars.lerp_ (v, self.mom)\n",
    "        return m,v\n",
    "        \n",
    "    def forward(self, x):\n",
    "        if self.training:\n",
    "            with torch.no_grad(): m,v = self.update_stats(x)\n",
    "        else: m,v = self.means,self.vars\n",
    "        x = (x-m) / (v+self.eps).sqrt()\n",
    "        return x*self.mults + self.adds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv_layer(ni, nf, ks=3, stride=2, bn=True, **kwargs):\n",
    "    # No bias needed if using bn\n",
    "    layers = [nn.Conv2d(ni, nf, ks, padding=ks//2, stride=stride, bias=not bn),\n",
    "              GeneralRelu(**kwargs)]\n",
    "    if bn: layers.append(BatchNorm(nf))\n",
    "    return nn.Sequential(*layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def init_cnn_(m, f):\n",
    "    if isinstance(m, nn.Conv2d):\n",
    "        f(m.weight, a=0.1)\n",
    "        if getattr(m, 'bias', None) is not None: m.bias.data.zero_()\n",
    "    for l in m.children(): init_cnn_(l, f)\n",
    "\n",
    "def init_cnn(m, uniform=False):\n",
    "    f = init.kaiming_uniform_ if uniform else init.kaiming_normal_\n",
    "    init_cnn_(m, f)\n",
    "\n",
    "def get_learn_run(nfs, data, lr, layer, cbs=None, opt_func=None, uniform=False, **kwargs):\n",
    "    model = get_cnn_model(data, nfs, layer, **kwargs)\n",
    "    init_cnn(model, uniform=uniform)\n",
    "    return get_runner(model, data, lr=lr, cbs=cbs, opt_func=opt_func)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can then use it in training and see how it helps keep the activations means to 0 and the std to 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.9, conv_layer, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.26532763671875, tensor(0.9189, device='cuda:0')]\n",
      "valid: [0.16395225830078125, tensor(0.9520, device='cuda:0')]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmUAAAD8CAYAAAA2edOFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8VFX6x/HPyUwK6ZBCAiEkkBCqdFCkigIW7CIoigorKq76c3Vdt4i6ltW1rGtZe8OKKBoVARULIL1JTQgQUgik9zKZmfP74wYMISCQSe5M8rxfr7wyM/dm5gFx8p1zz3mO0lojhBBCCCHM5WV2AUIIIYQQQkKZEEIIIYRbkFAmhBBCCOEGJJQJIYQQQrgBCWVCCCGEEG5AQpkQQgghhBuQUCaEEEII4QYklAkhhBBCuAEJZUIIIYQQbsBqdgGnIzw8XMfFxZldhhCihWzYsCFfax1hdh2uIO9fQrQ9J/se5pGhLC4ujvXr15tdhhCihSil9ptdg6vI+5cQbc/JvofJ5UshhBBCCDcgoUwIIYQQwg1IKBNCCCGEcAMeOadMCCFak9raWrKysqiurja7lOPy8/MjJiYGb29vs0sRotWSUCaEECbLysoiKCiIuLg4lFJml3MMrTUFBQVkZWURHx9vdjlCtFpy+VIIIUxWXV1NWFiYWwYyAKUUYWFhbj2SJ0RrIKFMCCHcgLsGssPcvT4hWgO5fCmEQGvN3vwKNu4vwt/HyoVnRJtdkhBCuA27w0l2cRXpBZWk51dQXmNnzrgEl7+OhDIh2qCy6lq2ZJawMaOIjRlFbMoopqSqFgCloFvEKHpFB5tcpWhpixcv5s4778ThcDBr1iz+8pe/mF2SaCWKK23kltUQEehLqL+3W468Ngxe6QUVpOdXsL+gksyiSmod+si5YQE+3Da2u8v/HBLKhGjlnE7N3vxyNu4vZlNmERv3F5OaW4bWRgBLjAxkUp8oBnUNJSkqmOvfWMNTS1J444ahZpcuWpDD4WDOnDl8++23xMTEMHToUC6++GJ69+5tdmnCw/2UmsftH2ykrNoOgLdFERbgS0SQ8RUe6GPcDvQlvO774WOBvlaXBh+7w8mB4mr2FVSwv6CCffnHD17+Pha6hgXQMzqISX2jiAsLIC48gLhwfyICfZslWEooE6KVKa2uZXNGcd0oWDGbM4oorXszDPazMjC2Pef3i2JQbHv6dwklpN3RLQ5mj+nOv5eksD69kCFxHcz4IwgTrF27loSEBLp16wbA1KlT+eKLLySUidOmteaNFft4bNFOenQM4pYx3SmssJFXXkNeWQ355TUcKq1mW3YJBRU2HE59zHP4Wr3qhTffRsNbZN2xdj4WoPHgtb9u9OtEwWti3yjiwwLoGuZPfHgAEUHNE7xOREKZEB7M6dSk5ZWzKcMYAduYUURaXvmRUbCkjkFceEY0A2PbMyg2lG7hgXh5nfhN5saz43hrZTpPLknh45vPdMvLDK3ZQ19uZ8eBUpc+Z+9Owcyd3OeE52RnZ9OlS5cj92NiYlizZo1L6xBtR3Wtg78u3MpnG7M5v28UT13VnwDf40cOp1NTVHl0YMsrO3zbRl5ZDRkFlWzYX0Rhha3R5wj0tRLSzpvcsuqjglc7bwtdw/xJijKCV1yYP3FhAaYFrxORUCaEBymprGVTpjEHbGNGEZszi49cEgj192Zgl1Am9+9UNwoWQpDfqTf69Pexcsf4BB74Yjs/peYxNinS1X8M4Ya0PnaUwp1+WQnPcai0mtnzNrA5s5i7zk3kjnMSf/fDoJeXIizQl7BAX3pGnfj5ax1OY8StrOZIiDsc5Iora+kY7Ed8uD9d64JXpJsFrxORUCaEm9Nas3jbQZ77fje7DpYB4KWgR8egIwFsYGwo3cIDXPbGM3VoLK8t38u/l6QwOjHid99Qhev83ohWc4mJiSEzM/PI/aysLDp16mRKLcJzbcks5uZ56ymrtvPy9EFM6uv6ldzeFi86BvvRMdjP5c9tNgllQrixtNxyHvpyO8t355PUMYh7JvRgUGx7zugSSuAJLgU0lY/Vi/87twd3z9/Com05XHSG/HJu7YYOHcru3bvZt28fnTt35qOPPuKDDz4wuyzhQT7flM2fP/2VyCBfPr11hKzgPg0SyoRwQ+U1dp7/fjdvrNhHOx8LD07uzfQzu2K1tFy/50sGdObln/bwzNJUJvWJatHXFi3ParXywgsvMHHiRBwOBzfddBN9+pgzaic8i8OpeXLJLl75aS/D4zvwv+mD6RDgY3ZZHklCmRBuRGtN8pYDPLZoJ4dKa5gyJIY/T+pJeKBvi9di8VLcMyGJm+dtYMGGLKYOi23xGkTLuuCCC7jgggvMLkN4kNLqWu78cBM/pORx3ZldeWByb7zlA9xpk1AmhJvYdbCUB77Yztp9hfTrHMLL0wczMLa9qTWd17sjA2NDee773Vw6sDN+3hZT6xFCuI+9eeXMenc9GQWVPHpZX64d3tXskjyehDIhTFZSVcuz36Yyb/V+gvysPHZZP64e2gWLG0yuV0px78QkrnltDe+t3s+sUd3MLkkI4QYON4T1tnjx/qzhDO8WZnZJrYKEMiFM4nRqPt2YxROLd1FQYePa4bH86bwk2rvZXIwR3cMZlRjOiz+kcfXQLqfVZkMI0To0bAj72vVD6NLB3+yyWg2XXPhVSk1SSqUopdKUUsdslqaU8lVKfVx3fI1SKq7u8TilVJVSanPd18uuqEcId7ctu4QrX/6Fexf8SpcO/nx5+0geubSf2wWyw+6dmERRZS2vL99ndikup5R6UymVq5TadpzjPZVSq5RSNUqpexocS1dKba17/1rfMhULYY7qWgd/+mQLj3y9k4l9ovj01hESyFysySNlSikL8CJwHpAFrFNKJWutd9Q7bSZQpLVOUEpNBZ4Arq47tkdrPaCpdQjhCYoqbDy1NIUP1mYQFuDDU1f15/KBnd2+D9gZMaGc3zeK15fv5fqzuhJmwsKDZvQ28ALw7nGOFwJ3AJce5/g4rXV+M9QlhNs4nYaw4tS5YqRsGJCmtd6rtbYBHwGXNDjnEuCdutsLgPHKU9rrCuECDqfm/TX7Gff0j3y0LpMbRsSx7J6xXDk4xmPe2P40oQdVtQ5e+nGP2aW4lNb6Z4zgdbzjuVrrdUBty1UlhPvYklnMxS+sIPVQGS9PH8Rd5/bwmPctT+OKUNYZyKx3P6vusUbP0VrbgRLg8KzAeKXUJqXUT0qpUcd7EaXUzUqp9Uqp9Xl5eS4oW4iWsTGjiEtfXMnfFm4jqWMQX98xkrmT+xDsYXOzEiKDuGJQDPNW7+dAcZXZ5bgLDSxVSm1QSt1sdjFNcdNNNxEZGUnfvn3NLkW4kc83ZXPVK6vwtnjx6a0jmqVDv/iNK0JZY3G54SZqxzsnB4jVWg8E7gY+UEo12gJYa/2q1nqI1npIREREkwoWoiXkl9dw7ydbuPylX8gtq+a/0wby0c1n0jPKc7tc33VeD9Dw3He7zS7FXZyttR4EnA/MUUqNbuwkT/hQecMNN7B48WKzyxBuwuHUPP7NTu76eDMDu4SSfPtI6dDfAlwRyrKALvXuxwAHjneOUsoKhACFWusarXUBgNZ6A7AH6OGCmoQwjd3h5O2V+xj31I98vjmb2WO68f2fxnJx/04esynu8XQObce1Z8byyYZM9uSVm12O6bTWB+q+5wILMaZzNHae23+oHD16NB06dDC7DOEGSqtrmfXOOl75aS/XndmV92YNlw79LcQVLTHWAYlKqXggG5gKXNPgnGRgBrAKuBJYprXWSqkIjHDmUEp1AxKBvS6oSQhTrNlbwNzk7ew6WMaoxHDmTu5DQmSg2WW51JxxCXy8LpNnlqby4rWDzC7HNEqpAMBLa11Wd3sC8HCTn/ibv8DBrU1+mqNE9YPz/+Xa5xStUv2GsI9c2pfpZ0pD2JbU5FCmtbYrpW4HlgAW4E2t9Xal1MPAeq11MvAGME8plYYxoXZq3Y+PBh5WStkBB3CL1vq4E26FcFeHSqt5fNFOPt98gM6h7Xh5+iAm9ony+JGxxoQH+jJrZDz/XZbGrdkl9O0cYnZJTaKU+hAYC4QrpbKAuYA3gNb6ZaVUFLAeCAacSqm7gN5AOLCw7r+xFfhAay3X/4THqt8Q9r1ZwzlTGsK2OJc0j9VaLwIWNXjsgXq3q4GrGvm5T4FPXVGDEM3N7nBSWGEjr7yGvLIa8stt5JXVkFNSxacbsqh1au44J4FbxybQzqd1b0c0a3Q33l29nyeXpPDuTY1esfMYWutpv3P8IMa0jIZKgf4uL0hGtEQLk4aw7kM6+os2zenUFFUaQSu/zEZeeXXd98PB67fvBRU2dMMlLECAj4URCeH8/cJedA0LaPk/hAmC/by5bWx3Hlu0i9V7C+QTtRAeqrrWwV8XbuWzjdmc3zeKp67qT4CvRAOzyN+8aLVqHU427i/iUNnRAav+7YIKGw7nsUnL1+pFRJAv4YG+dOngz6Cu7QkP9CUiyJeIQF8ignyICPQjPMgHf5+2+b/R9WfF8eaKdJ5cvItPbx3RKi/VtiXTpk3jxx9/JD8/n5iYGB566CFmzpxpdlmiGa3aU8BfF25lX36FNIR1E23zt4lo9XJKqpjz/kY2ZhQfeczqpY4Eq47BfvTpFHwkZIUfCVvG7SBfq4SM3+HnbeGO8Yn8deFWvt+Zy7m9O5pdkmiCDz/80OwSRAsprrTx2KKdzF+fRWwHf96bOZyRieFmlyWQUCZaoeW787jzo83U1Dp44op+DIxtT0SgLyHtvOVToItdNSSGV3/ew1NLUzinZ6T8/QrhxrTWJG85wMNf7qC4qpZbx3bnjnMSW/0cWE8ioUy0Gk6n5vllafzn+1QSIwN56drBra4dhbvxtnhx94Qk7vhwE8lbDnDpwIabeQgh3EFGQSV/+3wry3fn079LKO9d3k+awbohCWWiVSissHHXx5v5OTWPywZ25tHL+rbZuV4t7aJ+0bz84x6e+TaVC/pF42N1RU9qIYQr2B1O3lixj2e/S8WiFA9d3IfpZ3bFIqPabkl+awmPtymjiDnvbyS/3MZjl/Vj2rAuMh+sBXl5Ke6dmMSNb6/j4/WZXCfNJoVwC1syi7n/s63syCnlvN4defiSPkSHtDO7LHECEsqEx9Ja884v6Ty6aCcdg/349NYR9Ivx7EamnmpsUgRD49rz/Pe7uXJQjMxREcJE5TV2nl6awju/pBMR5MvL0wczqW+U2WWJkyChTHik8ho7f/n0V776NYfxPSN5ZsoAQvy9zS6rzVJK8edJPbnq5VW8/Us6t47tbnZJQrRJ3+04xANfbCOntJrpw7ty76Qkgv3kvdFTyOQP4XFSD5Vx8QsrWLQ1hz9PSuK164dIIHMDQ+M6MC4pgpd/2kNJVa3Z5YhTlJmZybhx4+jVqxd9+vThueeeM7skcQpyS6u57f0NzHp3PUF+3iy4ZQT/vLSvBDIPI6FMeJSFm7K45IWVlFbZeX/Wmdw2NkHaMLiReyYmUVJVy6s/7zG7FHGKrFYrTz/9NDt37mT16tW8+OKL7Nixw+yyxO9wOjXvrd7P+Gd+4rududw7MYkv/ziSwV3bm12aOA1y+VJ4hOpaBw9/tYMP1mQwLL4DL0wbSGSwn9lliQb6dAphcv9OvLkinRkj4ogMkv9GniI6Opro6GgAgoKC6NWrF9nZ2fTu3dvkysTxpB4q4/7PtrJhfxEjuofx6GX9iA9vG1u9tVYSyoTbyyys5Lb3N7I1u4TZY7px74QkrBYZ5HVXd5/Xg0Vbc3hxWRoPXdLX7HI8zhNrn2BX4S6XPmfPDj25b9h9J31+eno6mzZtYvjw4S6tQ7hGda2Dl35I438/7SHQ18pTV/XnikGdZdV5KyChTLi173ce4u75W3BqzavXDWZCH1lB5O7iwwOYMqQLH6zNYNaobnTp4G92SeIUlJeXc8UVV/Cf//yH4GBpLupuVu0p4G8Lt7I3v4LLB3bmbxf2IizQ1+yyhItIKBNuye5w8sy3qbz04x76dArmf9cOJjZMfrl7ijvHJ/LZxiye/S6VZ6YMMLscj3IqI1quVltbyxVXXMG1117L5Zdfblod4lgN96ucN3MYoxIjzC5LuJiEMuF2csuquePDTazeW8i0YV2YO7kPft7S98qTRIX4MWNEHK8t38stY7rTo2OQ2SWJ36G1ZubMmfTq1Yu7777b7HJEHdmvsm2RiTnCrazZW8BF/13B5sxinrqqP49ffoYEMg9165juBPpYeWpJitmliJOwcuVK5s2bx7JlyxgwYAADBgxg0aJFZpfVpmUWVjLjrXXc+dFmYjr48+XtI7lvUk8JZK2YjJQJt6C15tWf9/LkkhRiO/jz7sxh9IyS+SyerH2AD38Y3Y1nvk1lU0YRA2Nlib47GzlyJFprs8sQdQ6WVHPBc8txai37VbYhMlImTFdSVcvseRt4/JtdTOzTkeTbz5ZA1krcNDKesAAf/i2jZUKckue+30213UHyH0cyY0ScBLI2QkKZMNW27BImP7+CZbty+cdFvXnxmkEESQfqViPQ18qccQn8sqeAFbvzzS5HCI+wJ6+c+eszuXZ4V7pHBJpdjmhBLgllSqlJSqkUpVSaUuovjRz3VUp9XHd8jVIqrsHxWKVUuVLqHlfUI9yf1pqP12Vw+f9+wWZ38vHsM5k5Ml767LRC154ZS+fQdvx7yS65PCbESXh6aQp+Vi9uPyfB7FJEC2tyKFNKWYAXgfOB3sA0pVTDFtAzgSKtdQLwLPBEg+PPAt80tRbhGbTW3P/ZVu77dCvD4zvw9R0jGdy1g9lliWbia7Vw57mJbMkqYcn2g2aXI4Rb25JZzKKtB5k1qhvh0n+szXHFSNkwIE1rvVdrbQM+Ai5pcM4lwDt1txcA41XdkIhS6lJgL7DdBbUID/DF5gN8tC6T2WO68faNw6TxYRtw+cDOdI8I4KmlqTicMlomRGO01jyxeBdhdYtkRNvjilDWGcisdz+r7rFGz9Fa24ESIEwpFQDcBzz0ey+ilLpZKbVeKbU+Ly/PBWULM1TU2Hn8m530jwnhvok9ZfJqG2G1eHHPhCTScsv5bGOW2eUI4ZaW787nlz0F3H5OAoG+0hyhLXJFKGvst2rDj8LHO+ch4FmtdfnvvYjW+lWt9RCt9ZCICOli7Kle/CGNQ6U1zL24D14SyNqUSX2jOCMmhP98t5sau8PsckQD1dXVDBs2jP79+9OnTx/mzp1rdkltitNpjJLFtG/HNcNjzS5HmMQVoSwL6FLvfgxw4HjnKKWsQAhQCAwHnlRKpQN3AX9VSt3ugpqEG0rPr+D15fu4YlAMg6RnVZujlOLeiUlkF1fx/uoMs8sRDfj6+rJs2TK2bNnC5s2bWbx4MatXrza7rDbjq605bD9Qyp8m9MDXKs1h2ypXhLJ1QKJSKl4p5QNMBZIbnJMMzKi7fSWwTBtGaa3jtNZxwH+Ax7TWL7igJuGGHvl6B94WxX2TkswuRZhkZEI4Z3UL48Uf0iivsZtdjqhHKUVgoNF+oba2ltraWlkN3UJsdidPL02hZ1QQl/RvOPtHtCVNvmittbbXjW4tASzAm1rr7Uqph4H1Wutk4A1gnlIqDWOEbGpTX1d4lh9TcvluZy73n9+TyGA/s8sRJlFKce+kJC5/6RfeXLGPO8Ynml2S2zn42GPU7Nzl0uf07dWTqL/+9XfPczgcDB48mLS0NObMmcPw4cNdWodo3MfrMthfUMlbNwyVaR1tnEtmEmqtFwGLGjz2QL3b1cBVv/McD7qiFuF+bHYnD3+1g27hAdx4drzZ5QiTDYptz+zR3TgjJsTsUkQDFouFzZs3U1xczGWXXca2bdvo27ev2WW1ahU1dp77Po1h8R0YmyTzpds6Wd4hmt07v6SzN6+Ct24Yio9VNpEQcP8FvcwuwW2dzIhWcwsNDWXs2LEsXrxYQlkze3PFPvLLa3j1+sFyuVjINkuieeWWVfPc97s5p2ck43pGml2OEOI48vLyKC4uBqCqqorvvvuOnj17mlxV61ZYYeOVn/cyoXdHWfwkABkpE83s34tTqLE7+MdFDTd5EEK4k5ycHGbMmIHD4cDpdDJlyhQuuugis8tq1V78IY1Km50/y+InUUdCmWg2mzOL+WRDFrPHdCM+PMDscoQQJ3DGGWewadMms8toM7KKKpm3aj9XDo4hITLI7HKEm5DLl6JZOJ2aucnbiQjy5Y/nyAo7IYSo79lvd4OCu87tYXYpwo1IKBPN4rNN2WzJLOb+83vKdiFCCFFPysEyPtuUxQ0j4ugU2s7scoQbkVAmXK6supZ/fbOLgbGhXDpAGiEKIUR9/16yi0BfK7eN7W52KcLNSCgTLvf8sjQKKmp4cLLsbymEEPWtSy/ku5253DKmO6H+PmaXI9yMhDLhUnvyynlr5T6mDO5C/y6hZpcjhBBuQ2vNE9/sIiLIlxvPjjO7HOGGJJQJl9Fa8/CXO/CzWrhXlngLD6GUelMplauU2nac4z2VUquUUjVKqXsaHJuklEpRSqUppf7SMhULT/X9zlzW7y/izvGJ+PvIXFtxLAllwmWW7crlp9Q87jw3kfBAX7PLEeJkvQ1MOsHxQuAO4Kn6DyqlLMCLwPlAb2CaUsrjG/I5HA4GDhwoPcpczOHUPLlkF/HhAVw9tIvZ5Qg3JaFMuESN3cE/v9pBQmQgM0bEmV2OECdNa/0zRvA63vFcrfU6oLbBoWFAmtZ6r9baBnwEXNJ8lbaM5557jl69ZBssV1u4KZvUQ+X8aUIPvC3yq1c0Tv5lCJd4c0U66QWVPHBRb3nDEW1FZyCz3v2susc8VlZWFl9//TWzZs0yu5RWpcbu4NlvU+nXOYQL+kabXY5wY3JRWzTZodJqnl+2m/N6d2R0jwizyxGipTS2tFg3eqJSNwM3A8TGxp7wSZfPTyU/s7zJxdUX3iWQUVN+v0npXXfdxZNPPklZWZlLX7+te291BtnFVTxxxRmyIl2ckAxpiCZ74ptd2J2af1zo8dNphDgVWUD9yUExwIHGTtRav6q1HqK1HhIR4Z4fXL766isiIyMZPHiw2aW0KmXVtbz4QxojE8IZmRhudjnCzclImWiSDfsL+WxTNnPGdSc2zN/scoRoSeuARKVUPJANTAWuaeqTnsyIVnNYuXIlycnJLFq0iOrqakpLS5k+fTrvvfeeKfW0Fq/9vJfCChv3TeppdinCA8hImThtDqfmweQdRAX7cdvYBLPLEeK0KKU+BFYBSUqpLKXUTKXULUqpW+qORymlsoC7gb/XnROstbYDtwNLgJ3AfK31drP+HE31+OOPk5WVRXp6Oh999BHnnHOOBLImyiur4fUV+7jwjGj6xYSYXY7wADJSJk7bJ+sz2ZpdwnNTBxAg+1sKD6W1nvY7xw9iXJps7NgiYFFz1CU83/PLdmOzO7lngvRtFCdHfpOK01JSVcu/l6QwNK49F/fvZHY5QggXGjt2LGPHjjW7DI+2v6CCD9ZkcPXQLsSHB5hdjvAQEsrEaXnuu90UVtp4Z/IwlJLVREIIUd/TS1Pxtnhx5/hEs0sRHsQlc8p+b6sRpZSvUurjuuNrlFJxdY8PU0ptrvvaopS6zBX1iOa1+1AZ76xKZ9qwWPp2lnkSQghR37bsEpK3HOCmkXFEBvuZXY7wIE0OZSe51chMoEhrnQA8CzxR9/g2YIjWegDGNievKKVk9M6Naa156MsdBPhYZJ6EEEI04sklKYT6ezN7THezSxEexhUjZSez1cglwDt1txcA45VSSmtdWbeCCcCP4zReFO5j6Y5DrEjL5+7zetAhwMfscoQQwq38siefn1PzmDM2gWA/b7PLER7GFaHsZLYaOXJOXQgrAcIAlFLDlVLbga3ALfVCmnAz1bUOHvl6Bz06BjL9zK5mlyOEEG5Fa80Ti1OIDvHjurPkPVKcOleEspPZauS452it12it+wBDgfuVUo1egFdK3ayUWq+UWp+Xl9ekgsXpeX35XjILq3hwch+ssr+lEEIcZfG2g2zJLOb/zu2Bn7fF7HKEB3LF/K2T2Wrk8DlZdXPGQoDC+idorXcqpSqAvsD6hi+itX4VeBVgyJAhcpmzhR0oruLFH/Zwft8oRiTIViFCtEZxcXEEBQVhsViwWq2sX3/MW7E4DrvDyb+XppAQGcjlgzx6X3phIleEspPZaiQZmIHRNftKYJnWWtf9TKbW2q6U6gokAekuqEm42OPf7MKpNX+9oJfZpQghmtEPP/xAeLh88DpVn2zIYm9eBa9cN1iuJIjT1uRQVheoDm81YgHe1FpvV0o9DKzXWicDbwDzlFJpGCNkU+t+fCTwF6VULeAEbtNa5ze1JuFaa/cV8uWWA9wxPpEuHWR/SyGEqK/K5uA/36UyKDaUCb07ml2O8GAuaT/R2FYjWusH6t2uBq5q5OfmAfNcUYNoHg6nZm7ydjqF+HGrLO8Wotn98Par5O7f69LnjOzajXE33Py75ymlmDBhAkopZs+ezc03//7PCHj7l3QOldbw36kDpZm2aBLpCSZO6MO1GezMKeXFawbRzkcmrgrRmq1cuZJOnTqRm5vLeeedR8+ePRk9erTZZbm1kspa/vdjGuOSIhjeLczscoSHk1Amjqu40sbTS1M4s1sHLugXZXY5QrQJJzOi1Vw6dTL2sY2MjOSyyy5j7dq1Esp+x0s/pVFWY+fPk3qaXYpoBWQ2ojiuZ79NpaSqlrmT+8iQvBCtXEVFBWVlZUduL126lL59+5pclXvLKani7ZXpXDqgM72ig80uR7QCMlImGrXrYCnzVu9n+pld5c1GiDbg0KFDXHaZsf2w3W7nmmuuYdKkSSZX5d6e+243Tq25+7weZpciWpLDDhV5EBzt8qeWUCaOobXmweTtBLfzljcbIdqIbt26sWXLFrPL8BhpueXMX5/J9WfFyar01qiqGIrS67721budDsWZ4B8G9+52+ctKKBPH+GbbQVbvLeSfl/Yl1F/2txRCiIaeWpJCO28Lt5+TYHYp4nQ47FCa3XjoKtwH1cVHn+8fBu3joPNg6HsFtI8HrcHFU3sklImjVNkcPPr1TnpFB3PNsFizyxEAdhssfxpW/w8SxsM5f4ersDYJAAAgAElEQVQwaU8ihFk2ZxazePtB7jo3kfBAX7PLEcdTXXps4DocukoywVlvq20vK4TGGsGr7yDj+5GvruAX0iIlSyhrQ7TWVNocFFbYyC+vobDCRkG5jYIKGwV19/fklZNdXMUzU/pj8ZLJ/abL2QKf3waHtkG3sZC6GHYmw+AbYcx9EBhhdoXCRbTWbr2gRmvZ3Q6gxu7ggS+2ERbgw6xR3cwup+1wOqC6xBjBqi4xLi8ec78YKguhOMMIX1WFRz9Hu/ZGyOo0APpc9lvo6hAPQZ3AYn4kMr8C0SRVNgcFFccGrIIj9+sfq6G61tno8/h5exEW4EtYoA/3TkySfjtms9fAz/+G5c9AQARM+wiSzoeyQ/DTE7D+TdjyIYz4I5w1B3yDzK5YNIGfnx8FBQWEhYW5ZTDTWlNQUICfn5/ZpZju8UW7+DWrhJenDybQV36FnpLaquOEqbr7JzpWU3ri51YWaBcKfqEQ2gV6X9JgtCvOOO7m5F+Uh8gtreb5ZWkcKK4iv8JGYUUNBeU2Km2ORs/3sXoRHuBDh0AfwgJ8SYgIJCzQhw51wSsswIewQN+67z74+8g/BbeRvRG+mAO5O6D/NTDpMeMTHkBQR7joGTjzNlj2T/jxcVj3ujFqNmgGWGUOoCeKiYkhKyuLvLw8s0s5Lj8/P2JiYswuw1SLt+Xw9i/p3Hh2HJP6Su/G3+V0wP5fYOeXsOsrYw7XiXgH1AWrECNchcRAVF/jtl/I0cca3vcJcPn8LjPIb2IPUFxp47o31rKvoOJIuIoP8z82YNW7HeBjcctP3OIE7DXGKNiK/0BgJFwzH3pMbPzc8ASY8g5kbYDv5sKie2DVizD+H9D7MvCSFoSexNvbm/j4eLPLECeQUVDJvQt+pX9MCPef38vsctyXoxb2/WxMs9j5FVTmg9UPEs6FobMaBKvQevdDwOJtdvWmk1Dm5iptdm58ex378it468ahnJ0QbnZJojlkbzDmjuXtggHTYeKjJzfUHjMYZnwJad/Bt3NhwU0Q/V847yFjDpoQoslq7A7mfLARBbxwzSB8rPKh5yi11bD3B9iRDCmLjMuNPoGQOAF6XwwJ54FvoNlVegQJZW6sxu5g9rwNbMks5qVrB0sga41qq41LkL/8FwKj4NoFkHjeqT2HUsbPdD8Htn4Cyx6Bdy8x7p/7IET3b47KhWgzHl+0i63ZJbxy3WDpSXaYrQJ2f2uMiKUuAVu5MdqVdAH0uth4//GWOYinSkKZm3I4NXd/vIXlu/N58oozZP5Ca5S5Dr64DfJTYdD1MOGRpi279rJA/6nQ+1JY/4axUOCV0dDvKqONRvs4l5UuRFuxaKsxj2zmyHgm9mnj78PVJUYA2/EFpH0P9irwDzf6dvW+GOJGy7zWJpJQ5oa01vz98618vTWHv13QiylDu5hdknCl2ir44VFjDlhQJ5j+qTHfwlW8/YwVmQOnw8rnYNVLsP1zYz7H6HsgQEZchTgZ+wsquG/Br/TvEsp9bXXD8cpC2PW1MSK290dw2CAoGgZdZ4yIxZ7lFq0kWgv5m3RDTyxO4cO1mcwZ150/jJY+OK1KxhpjdKwgDQbfAOf9E/yaaW9RvxAY/wAM/YNxiXTtK7DpPTj7TjjrNmO1khCiUUfmkSl4YdrAtjWPrOyQsVpyxxeQvgK0A0JiYdjNRquJzkNkMVEzkVDmZl7+aQ8v/7SHa4bHcs+EJLPLEa5iq/xtdCwkBq77HLqPa5nXDo6Gi/8LZ90O3z8EPzwCa1+FsX8xLpvKiichjvHo1zvZll3Ka9cPaRvzyEqyjNYVO5IhYxWgISzB+BDX+2KIHtAqWk64OwllbuSjtRn865tdXHRGNP+8pK+0tGgt9q8y+o4V7oEhN8F5D5vT7DWiB0x9HzLXwrcPwNd317XReMD49Cv/3oQA4Otfc3h31X5mjYznvN4dzS6neWgNB7fC7iWQ8o2xAhwgso/xga3XxRDZS94XWpiEMjexaGsOf124lTE9InhmygDZ4qg1sFUaDV5X/8/oMH19MnQbY3ZV0GUY3PiNMWH3uwfhkxnGJrvnPgTxo8yuTghTpedXcN+nvzKgSyh/bm3zyGrKjHlhu5caKyfLcozHOw2E8XONIBYuG6ybSUKZG1i+O487P9rEwNj2vDx9cNuau9Bapa80RseK9hlzus590L369CgFSZOMVhpbPjIurb5zkdFP6NwHjS7aQrQx1bXGPDKLl+KFa1rBPDKtoWCPMRq2e6nxvuSsBd9gY/pE4kRjkVFQKx0N9EAuCWVKqUnAc4AFeF1r/a8Gx32Bd4HBQAFwtdY6XSl1HvAvwAewAfdqrZe5oiZPsTGjiNnzNtA9IpA3ZwylnY/F7JJEU9gq4LuHjEn1oV1hxlfuPfrkZYGB10Lfy2Hta7D8aaONxog/GpcwvNuZXaEQLebRr3ey/UApr18/hJj2HjqPrLYa9q8wRsJSlxgfDAEiesKZtxoNXWPPlLmkbqrJoUwpZQFeBM4DsoB1SqlkrfWOeqfNBIq01glKqanAE8DVQD4wWWt9QCnVF1gCdG5qTZ4i5WAZN761joggX96dOYwQf/mfxKPtWw7Jt0NROgybDefO9ZwVjt7t4Ow7jDYa3/4DVv7HWH118fPQdYTZ1QnR7L7ccoB5q/fzh1HxnOtp88hKsn67JLn3R6itNLY2ih9ttMdJnADtu5pdpTgJrhgpGwakaa33AiilPgIuAeqHskuAB+tuLwBeUEoprfWmeudsB/yUUr5a6xoX1OXWMgsrue6NNfhavXhv5nAig6TzsceqKTfmZq17DdrHww2LIO5ss6s6Pf4d4JIXoe+V8OUd8Nb5Rn+zcx80Z3GCEC1gX34F93+2lYGxHjKPzGGHrHXGZcnUpZC73Xg8NBYGXGuEsPhRMtLtgVwRyjoDmfXuZwHDj3eO1tqulCoBwjBGyg67AtjUFgJZbmk1176+hhq7k/mzz2oby61bE6cTDm2DfT/B3p9g/y/GJ9Mzb4Nz/gE+reC/Z/dxcNtqY8um1f+DlMUw+T+nvgWUEG6uutbBnPc3YrUoXrhmEN4WN51HVpFv7HG7e6nRTb+6GLysRvPW8/5pBLGIJFkt6eFcEcoa+xegT+UcpVQfjEuaE477IkrdDNwMEBsbe+pVuomSylquf3Mt+eU1vDdrOElRMvrg9rSGwr2/hbD05VBZYBwLSzC2Nuo/DboMNbdOV/MJgEmPQ5/L4Ivb4f0r4YypxmP+HcyuTgiX+OdXO9iRU8obM4bQOdTNRpYO7TCmEaQuqWtZoSEgEnpeaISw7uOatjWbcDuuCGVZQP19gGKAA8c5J0spZQVCgEIApVQMsBC4Xmu953gvorV+FXgVYMiQIQ1Dn0eotNm56Z117Mkr580bhjIotr3ZJYnjKTsE+36GfT/C3p+hJMN4PCjaWKHYbQzEj4GQNjAFssswuGU5/PwUrHgG9nwPF/zb2GNTPpULD5a85QDvr8lg9uhujO/lRvPInE746QnjC6DzIBh7vzFSHT1Auum3Yq4IZeuARKVUPJANTAWuaXBOMjADWAVcCSzTWmulVCjwNXC/1nqlC2pxWza7k1ve28imjCJeuGYQoxIjzC5J1FddYiwXPzwalrfTeNwvBOJGGZPg48dAeGLbDCJWXzjnb0Zn7y9uh09ugJ4XwYVPQ1Ab36RZeKR9+RXc/+mvDO7annsmutHuKZWF8NkfjEuV/acZlyYD5fdFW9HkUFY3R+x2jJWTFuBNrfV2pdTDwHqtdTLwBjBPKZWGMUI2te7HbwcSgH8opf5R99gErXVuU+tyJw6n5u75m/k5NY8nrujHBf2izS5J1FZD5prfQtiBTcb+btZ2xnLx/lcbISy6v9E2Qhii+sGs72H1i/DDY/DCMJj4qLFq00PDqlLqTeAiIFdrfUyDNmVsrfEccAFQCdygtd5Yd8wBbK07NUNrfXHLVC2aorrWwW3vb8Tb6sXz0wa6zzyy7I0wfwaUH4SLnoXBN3rs/1fi9LikT5nWehGwqMFjD9S7XQ1c1cjPPQI84ooa3JXWmn98sY2vfs3h/vN7cvVQz50P59GcDjiwue5y5E9GILNXg7IY3exH3W2EsC7DjFEhcXwWq7EfXtKFxgrN5Nth2wKY/By0jzO7utPxNvACRi/FxpwPJNZ9DQf+x2+Lmaq01gOau0DhWg9/tYOdOaW8ecMQOrnDPDKtYcPb8M2fIbAj3LTYeF8SbY509G9mTy1N4YM1Gdw6tjuzx3Q3u5y2xVYBmz8w+vbsWw41JcbjkX2MPSjjxxg9uPyCTS3TY4UnGM1xN7wF386Fl84y9tEcdrNHjS5qrX9WSsWd4JRLgHe11hpYrZQKVUpFa61zWqRA4VJfbM7mgzUZzB7TjXN6usE8stoq+PpPsPl96H4OXP46BISZXZUwiYSyZvTqz3t48Yc9TBsWy5/dac5CW+Cww8fTYc8yo7N+n0uMEBY/GgIjza6u9fDygqEzocdE+PIuWPwX2PaZ0XQ20gP6PZ2cxtr+dAZyMHorrgfswL+01p+bUJ84SXvyyvnrZ1sZ0rU990xwg/fkwr3w8fVwaCuMuc/48qAPNML1JJQ1k/nrMnls0S4u7BfNI5f2Rcm8gJa19G9GILvoPzDkRrOraf1CYuDaT2DrJ/DNffDKKBj9Zxh5V2vYzuVELX1i63Yk6QYsU0ptbWwVeWtp6ePJDvcj87F68V93mEeW8g18NtuYM3bNJ9DjuB2hRBviJrMbW5fF23L4y2e/MioxnGevHoDFSwJZi1r/Fqx52WjmKoGs5SgFZ0yBOWuNlZk/PAKvjjUWUXi247b90Vof/r4X+BEY2NgTaK1f1VoP0VoPiYiQlXRmeOjL7ew6WMYzVw8wdx6Z0wHfPwwfTjW2Ppr9kwQycYSEMhdbsTufOz7czIAuobxy3WB8rPJX3KL2LYdF90DCucZSctHyAiPgqrdg6gdGF/LXzoFvHzDmznimZOB6ZTgTKNFa5yil2iulfAGUUuHA2Ry9vZxwE59vyubDtZncOrY745JMnL5QkQ/vXQ7Ln4aB18HMbz11cYxoJnL50oU2ZRRx87z1xIcH8OYNQ/H3kb/eFlW4F+ZfBx26wZVvGqsEhXl6Xghdz67b4Pw52Fm3wbmb7QuqlPoQGAuEK6WygLmAN4DW+mWMleUXAGkYLTEOD7/2Al5RSjkxPuD+S2stoczN7Mkr568LjXlkfzqvh3mFZK2H+dcbwezi52HQ9ebVItyW/NZykdRDZdz49jrCA32ZN3MYof4+ZpfUtlSXwgd17e+mfSRbj7iLdqHGL6C+V0DyHfD2BTBkprHBuZusetVaT/ud4xqY08jjvwD9mqsu0XRVNmMemZ+3heevGYjVjHlkWsO612Hx/RAcDTOXQifpoiIaJ6HMBTILK7nujTX4WLx4b+ZwIoP9zC6pbXE64NOZULgHrlsIYdJ6xO10Gwu3rYJlj8LqlyB1sdHXTDY4F83o8Dyyt28cSnSICfPIbBXw1f/Brx8be1Ve9orsG+uGnNqJzWHD5rQZ3w9/OW3UOmqPPF7jqDly30t5MTFuostrkVDWRDa7kxvfXkeVzcH8W84iNszf7JLanm8fgN1LjQ7Y8aPNrkYcj08ATHrM2OA8+XbI2SKhTDSbhZuy+GhdJreN7c5YM+aR5acZ0ylyd8K4v8Goe2TPytOktabSXkmZrYwyWxnlteXGd1v5b7frfW8YrBrePhysDocsu7afck2hvqESytzRWyv3kZZbzls3DKVnlHtcjmlTNr4Lq14wGpYOucnsasTJ6DIUZv8MSn5BieaRllvO3xZuY1hcB+42Yx7Zzi/h89vAywrTP4WE8S1fg5sptZWSV5l3VIA6fLvcVn7U7VJb6W+P15ZRUVuBUztP+PxWZSXQJ5AA7wD8LH74WHzwtnjj4+VDkE8QPhYffLx8jO8WH7y9vPGx+OBr8cXH67dzDx8/6vzDx+ud79tMO79IKGuC3LJqnl+WxviekYzrKQ1JW9z+X+Cru6HbOJj4uNnViFMhW1mJZlJ/Htl/p7XwPDKHHZY9bCxs6TQIprwDoW2rL51TO8kqy2JX4S5SilJILUwlpSiFnIrjb4DhpbwI9A4kyCeIIJ8gAr0D6RTYiSDvIAJ9Ao8+5hN45PH6x9tZ27WKfqASyprg34tTqLE7+PtFvc0upe0pSjc69rfvarRfkJWWQgjgweTtpBwq452bhhEV0oLze8tzYcFNkL7cWMwy6fFW/+GjsraS1KJUUotSSSlMIaUohd1Fu6m0VwJG2IoLjmNAxACmJE2hc2DnY8JXkE9QqwlUriC/yU7TlsxiPtmQxezR3YgPDzC7nLalpgw+nAZOO0z7GNq1N7siIYQb+DEll4/XZzJnXHfG9GjBJr0Zq2H+DKguMSbz95/acq/dArTWHKw4+NvoV10IyyzLRNdtbhHkHUSPDj24NOFSkjokkdQ+ie6h3fGzysK3UyGh7DQ4nZoHv9xOeKAvt5+TYHY5bYvTAZ/OgrwUY65GuPz9CyEMry/fR1SwH3ed20LzyLQ2dg9Z+nfjMuX0TyGqb8u8djOpcdSQVpx25LLj4RGwMlvZkXO6BHWhZ4eeTO4+maT2SSR1SCI6IFpGu1xAQtlp+GJLNpsyinnyyjMI8vP4ff08y/cPGe0ULngKuo8zuxohhJtIPVTGirR87p2Y1DL7WtaUQ/IfYftnkHQhXPqS0ZfPg5TUlLCjYAc7C3eyq3AXqYWppJem49AOANpZ25HYPpFJcZOOhK/E9okEeMvVoeYioewUVdTY+dc3uzgjJoQrB8WYXU7bsvkDYwLtkJkw7A9mVyOEcCNvrdyHr9WLa4a1wMT63F1Gd/6C3UYj5BF3un27i8MBbHvBdnYU7GBHwQ6yy7OPHI8KiCKpfRLju44/EsC6BHXBS1ZJtygJZafopR/TOFRaw0vXDsZLNhpvORlr4Ms7jT5k5z9hdjVCCDdSWGHjs43ZXD6oM+0DmnE3FVslLH8KVv7X2DXkus+h25jme73TdDiA1Q9h9QNYTGAMfcL6cFWPq+gd1pveYb0J8ZVdUNyBhLJTkFFQyWvL93HZwM4M7iqTy1tMcQZ8fC2ExMBV74BFLhkLIX7z4doMauxObjw7vvleJHUJLLrHeD86YypM+CcEmt8K6fcCWOfAzhLAPIiEslPwyNc7sHop7pvU0+xS2o6acmOlpd0GN3wsW5QIIY5S63Ayb9V+RiaE06NjkOtfoCQLvrkPdn0F4Ukw4yuIH+X61zmZUuoFsMMhrGEA6x3WWwKYB5NQdpJW7M5n6Y5D3DsxqWV737RlTicsnA25O+DaBRBhQmduIYRb+2bbQQ6WVvPY5S5e9eioNfZp/fEJ0E4Y/wCc9UewNuPl0Xqc2snGQxvZkrflSAjLKs86cvxwALuyx5X0CesjAayVcEkoU0pNAp4DLMDrWut/NTjuC7wLDAYKgKu11ulKqTBgATAUeFtrfbsr6nE1u8PJw19tJ7aDPzNHNuPwuDjasn8an04nPSHblAghGvXmin3EhwcwtocLLyXuXwVf3218IOxxvjGPtX1X1z3/CRRVF/FF2hd8kvoJGWUZwG8B7IoeVxgjYB16E+rnWSs9xclpcihTSlmAF4HzgCxgnVIqWWu9o95pM4EirXWCUmoq8ARwNVAN/APoW/fllt5bvZ/UQ+W8ct1g/LwtZpfTNvw6H1Y8A4NmwPDZZlcjhHBDGzOK2JxZzEMX93HNwquKfPh2Lmx+D0K6wNQPoOeFTX/e36G1ZnPeZuanzGdp+lJsThuDIgdxS/9bGNV5lASwNsQVI2XDgDSt9V4ApdRHwCVA/VB2CfBg3e0FwAtKKaW1rgBWKKXctgNoYYWNZ75N5eyEMCb07mh2OW1D1nr44nboOtLoRyYNCYUQjXhrZTpBflauHNzE9kROJ2x6F7570Ngx5Oy7YMyfwad5+3GV28r5au9XzE+dz+6i3QR4B3B54uVMSZpCYvvEZn1t4Z5cEco6A5n17mcBw493jtbarpQqAcKAfBe8frN65tsUKmwO5k7uI92KW0JJljGxPzgarp7XYvM3hBCeJaekikVbc7hxRBwBvk34VXZwK3x1N2Stha5nw4VPQ2Qv1xXaiJ0FO5mfOp+v935Nlb2KXh16MfesuVwQfwH+3v7N+trCoLUGpxNtt4PdjnY40A7Hb7ftDnAcvm2Huu+Hb+Plhf+gQS6vyxWhrLGkok/jnBO/iFI3AzcDxMa2QHNAYGdOKR+syeD6s+KaZ1WPOJqtwghktVUwI1lWWgohjmveqv1orZkxIu70nqCmDH543NgmqV0oXPo/6D+t2Ubmq+3VLElfwvyU+fya/yt+Fj8mxU/i6qSr6RMmH/qPRzscOMvKcJSU1H2V1n0vxlFSgrOkBEdx3bHSUhylJejaWrA76oKW/cjthuGrKSyhofRYvcpFf8rfuCKUZQFd6t2PAQ4c55wspZQVCAEKT+VFtNavAq8CDBky5JQC3enQWvPQl9sJaefNXefKMHKzczph4S1waJuxyXgzf1IVQniuKpuDD9ZmMKF3FF06nOLIktaw43NYfD+U5cDgG2D83Gb7ELivZB/zU+aTvCeZUlsp8SHx3Df0PiZ3n9ymVkvq2locxcUnH67qznOWlhr/zY7DKyAAS0gIXiEhWEJC8I3vhvLxQVktYLWiLFbjtsWKsliOvu1tPfZxqwUsFpTVG2W1oCwNHrdYUd5WlE/zXMVxRShbByQqpeKBbGAqcE2Dc5KBGcAq4EpgmdYn+Ft2A99sO8jqvYX889K+hPrLJbRm9+PjsDMZJjwKPSaYXY0Qwo0t3JRNcWUtN54dd2o/WLAHFt0Le76Hjv1gyjzoMtTl9dU6almWuYz5KfNZe3AtVi8r58aey5SkKQzpOKRVjYo5Kyux5+U1+Mo/5jFHUdHxn8TLC0twsBGuQkOwtA/FJy7uyGOW0JDfglfwb/ctwcEo79bVTLzJoaxujtjtwBKMlhhvaq23K6UeBtZrrZOBN4B5Sqk0jBGyqYd/XimVDgQDPkqpS4EJDVZutrjqWgePfr2TnlFBLbOPWlu3dQH8/CQMnA5nzTG7GiGEG9Na89bKffTpFMyw+JMc3aqtNvbNXf40WHxg0r9g6B/A4tpWnQfKD7AgdQGf7f6MguoCOgV04s5Bd3JpwqWEtwt36Ws1J601zpKSRsLWsYHLWVFx7BN4e2MND8caEYF3ly60GzQQa0QE1g4d6o1qhf4WtgICUG6+d2hLccm/SK31ImBRg8ceqHe7GrjqOD8b54oaXOnVn/eSXVzFh384E4vsb9m8sjfAF3Mg9iy48BlZaSmEOKEVafnszi3nqav6n9yI055l8PU9ULgH+lwGEx+D4E4uq8fhdLDywErmp8xnefZytNaMjhnNlKQpnN3pbCxe7tVGSdfWYs/NpTYnx/g6kEPtwRxjNOtw4MrPR9tsx/ys8vfHGmGELd9ePQkYPcoIWxERWMPrvkdGYAkJkZB1mqSjfwMHiqt46cc0LugXxVndw8wup3UrPQAfXmPsH3f1e2D1NbsiIYSbe2tlOuGBPkzuH33iE0tzYMlfYftn0KEbTP/MpU2o86vyWbh7IQtSF3Cg4gDh7cKZ1W8WVyReQadA14W+U6G1xlFcjL1h4Dp8O8cIXzidR/2cV0gI3pFGqPKPG4KlbpTr6K9ILIGn3iKk7GAxKQtWodPLsGhFrcWJ088Lr2A//CKCCIqNIKJnJ4Ki3X8/aYfDQXlOMcX786guriDpwsEufw0JZQ3865tdaA33ny8TzZuVrdJYaWkrh+u+hQDPGdoXQphjb145y3blcte5ifhajzMC5bDDutdh2SPgsMHY+42+Y95N3x7P4XTwy4FfWJi2kB8yfsCu7QyPGs6fhvyJcbHj8PZq3vlNzpoaI2AdPFgXsg4YQetA3WM5OeiqqqN+Rvn4YI2Owju6EwEjRuAdHY13p2isUcZ376govPxd24ajKCOf3Z+uwZJVQbglgiivQKqUolpXE6T9aGcLMBpi5QM7CylZUki+s4YqRyU12LBZHDh9vfAK8sUnIpDAmDDCe0QTHBOGxeLakceaymqK9+VRmplPZW4JtsIK7GU1UGXHq1ZjdXrhgze+yhdfix8WZcUCWBxV0Ax9hSWU1bMuvZDkLQe445yEU1/RI05eZSEk/xFytsC0D6Fjb7MrEkJ4gLd/ScfH4sW1w4+z5VH+blhwExz8FbqfYzSfDuve5NdNL0nniz1fkJyWTG5VLu192zOt1zSu6nEV8SGu3XpPa01t9gGqf91C1bbt1GZmHrnU6CgoOOZ8S0Q43tGd8E1MJHD0aLyjo7BGR+Md3QnvTtFYOnRokYUFBWk5pC1ch/dBG+HWcDqpYCqVIseSS+DALiRdOh5vHyO0VpdWkZ96gJL0XCpzirEXVaIq7VidCh/tTXtnAO1sAahCZcxCTyml4vtSSpy1VDkqqaaaWi8HDl8vVJAPvmGBBHTuQFhiFKHxkVTmlVG8P5ey7CKq88uoLa7EWWFD1Tiw2BXe2mIELS8/fC3tAGgHtMOCMcUdHE471boKGzXYqKXSqwantQzVzopXkB9+YYHN8vcooayOw6l5MHk70SF+3DK26f8Ti0ZUFMCqF2Dta2ArM1ZaJp1vdlVCCA9QUlXLgg1ZTO7fiYigRqY6pH0Hn9wEFm+48i1j/lgTwkhFbQVL05fyedrnbMzdiJfyYlTnUdyfcD9jYsbgbXHNqJijrIzqrVup+vVXqrb8StWvvx4JX8rXF+8uMXhHd8KvVy9jhKte4LJ27IhXM7VmOBmHtmey78sN+ObaCfOOoLNqT7kqIduaS/vh8SReOIIejYxs+QW3I2ZId2KGHP93bU1lNQWpByned8gIboUV6Eo7Vif4OK2EaH/a1QbgVeQFRUBaOVU/pVGhU/FSXiiMeBWML2D8e6lxVCKmdksAACAASURBVFOjq7FpGxVe1ZRaqtC+pXj5e+Md4o9fRBABUe3p0C0S/8hgl4/KnQwJZXU+WZ/J9gOlPDd1AP4+8tfiUuW58MvzsO4NqK2EPpfC6HuhYx+zKxNCeIj56zKptDmObYOhNax+CZb+HSL7wLQPIPT0Vs1rrdmYu5GFuxeydP9SquxVxAXH8X+D/4/J3SYT4R/RpD+DttupSU09KoDZ9u490ofLp1s3AkeNol3/M/A74wz8evRwu5YPWRv3krVoC+0KNWE+EcTw/+3deXhU1cHH8e+5s2Vmsq+QjYCQsCOCArIKLrivVGurtrZvta3Vajdt7WsXra12sdrF2qp1q75WRXGDqigiCBVQdhMCIRuB7Mtk9nvP+8edhAQCJJAwWc7nYZ7MvXNn7hmS3PzmrCk0iwYq7dWkzh7NmHPO7JUw43DFkHlqHpmn5h3xmFAwRH3xARp278db2UCwvhXpDYFdwxIfgz3RjSs9gficFJJGpuGIdZ5wufqaSh+Yn8AeXFHI6XlJXDIlOh00B6XmKlj7MGx4EvQATLwS5n4f0sdGu2SKogwgYd3gn2v3csbIZCZmdZhwNRwwl0j67FkYexFc/jdw9LxZaX/rfl7f/TqvFr9KWUsZbpubC0ZewGWjL2NKWjdHeR5CSkm4qqpTAPNv3470+wGwJCfjnDyZhIsuJGbyZJyTJmGJj+/xeU6G0jWF7Ht3G7HNGkm2VLJJpVHUU+44QMbCcYyfPzcq5bLZbWSMzyZj/AmufdqPqFAGPPLeLuq9QZ66+IxBNalf1DRVwpqHYONTYIRh8tUw93uQ2m/XnVcUpR97d+cBKht9/PSiDv1PPTXwf1+G8nUw/0cw/07owTQMQT3IyvKVvFr8Kh/v+xhDGpw+7HRumnITZ+ee3eM1KHVPK/5t2yIhbDO+LZvRa8zlnYXdTsy4cSR+YQnOyVNwTpmMLTu73/690XWdvat2UP3B58S32kmwJZNDOvXUUu6qIeuciUycFZ0gNtgN+VBWXO3hn2v3cvX0nM6fwJSeayyDj/4Anz4L0oBTr4U5d0By73aEVRRlaHnio71kJzk5Z3yGuWP/VnP0dmut2X9s4hXdfq2ddTtZWryUt0reoinQxDD3MP5n0v9w6ehLyYnLOfYLYK7HGCgujoSvLfg3byFQXHywGXLECNyzZrUHsJiCgj5blqe36LrO7hVbqFtbTIIvhnhbItkygzpqqIirJffCU5l8qgpifW3Ih7J739yB027h++cVRLsoA1f9Hlj9e9j8PCDgtOtgzu3H3a9DURSlzbbKJv67t567LxxnTua983V45RsQkwg3vg2ZU4/5Go3+Rt4seZOlu5ZS2FCIXbOzKHcRl425jBnDZhx1glcpJeH9+/Ft2Ypvy2b8m7fg27ED6fUCYElIIGbKZOLOOw/nlEgzZGJir73/vtJQVkv1llJaSmsIVTaTFHQTa40nRqabQSypnpEXT+PU8fOiXdQhZUiHspWfH+CDwhruvnAcqbFq4tIeqy2G1b+FLS+CZoXpN8Ls2yBh8LTvK4oSXU+sKcFlt7BkWjasegDevw+ypsM1z0HcsCM+r9OcYuXvEzbCTEiZwE9m/ITzR55/xMXAdY8nMhrSHBHp37LFnHAVEDYbjvHjcF1yBWJUAamzpxIzalS/bIbUdZ3awipqd5TTWlaH3uDD4pPESBtuzY3D4sQNuHGjyxhqZQ1NqQajrzid3FHzo138IWvIhrJg2OCXb+xkVJqb62flRbs4A0v152YY2/YyWBww42aYfetRL5CKoig9Vd3i543NVVw/PY2EN28yZ+effA1c/McjTgZb2lzKq8Wvdp5TbOwXuWz0ZeQn5Xc6VoZC+IuKzBC2eQu+rVsI7u4wGjIvD+OMubTGnUIw7MQa0HAbMcT5EhE7NGq2VxAwdhEwAoQIERI6hg1kjAXN7cCeaE6zEJeZTNLIdNypvduRP+QLsn9rGfWF+/Dva8BoCmALgBMHbkscVs1GApBAAoaMw4sHHz5qtAZwe7BnxJMwKp1hp41iRHLfzLul9MyQDWX/XFtCSW0r//zq6ditao2ubtm/DT58EHa8BjYXzLoFzvyOuUySoihKL3tuXRnJeg0/2PcrqNkKZ//crI0/pGaqbSqLx7c+zurK1ViEhTlZc/jx6B8zL3seNosNKSXBigr8baMht241R0MGAgCIpCSCk+fSOvFiDMONQ7ejiVjc1jjc5oBJvNJDCx6a7dWIGCvSF0YEDawIbFiJJwaHHoPN5wAf5oz1xQGgigaqqDFCBAwfARkkRJiwxcCwifYJSR3Jsbgy4onPTiUxLxWHKwZfg4d9n5bQtPsAwQPN4AlhD1lwEoPbGosmLKQggGR0I0wrLfjw02LxQ4KDmGGJJI0ZzrApuQNiSoihbkiGsuoWPw+/V8yiseksKFCB4piqNpvNBp+/AfY4mHsHzPw2uNXaoIqi9I1AWGfzundY7v4tjqYQfPEFKFjc6RhDGqwqX8Xj2x5nc81mkmOS+fap3+bKMVeSHLLj27qNxjf/jj/SFKnX1wOgx7jxTVlAcOFshBaHU8YQb0kg1uIkGZBC0kITzXiod/lw5aWQOTOf7PzuTZnka/DQUFpDS0U93pomQg1edE8Q/GEsIYlVWnBgI85wEBN2onks4AGqgO0thGihhhKCRgC75sABpOMA0ggaAVrx4BFeGm1etEQnrqxkUidkM3xsFhY1z+aANiS/ew8uLyQQ1rn7ov6xvE9ID1Hrq6XGV0Otr7b9fo23hjpfnXnfV0NLsIVERyJprjTSnemkOlNJd6Uf3Halku5MJ8GR0Dt9HCo3wqoHoehtcCSYQ85n3ASu5BN/bUVRlKPY/Mbf+Fv4Hoy44XD9i5B+cD3ikB7irZK3eHLbk+xu2k22K5NfZnydM+uSCf9rG82br6d2714AgvZYWifOR592LVZrPG7hJt6aSGJknUrdCNOsN1IrGpCJXuILhpMzu4Cc9OPvrO9MisWZFAunHnvkua7rNFc20FRag6eqgUCdh1CzD9kaRAQNpMOCNcVN7IgU0iflMnxEWlRmmldOjiEXyjaXN/LvjRXcNG8UI1N7vuJ9d0kpaQ21dgpbNd4aav211Ho7B7DGQONhzxcIkmKSSHOmkepMZXTiaOId8TQFmqj2VlPSVML6/etpCbYc9lybZiPd1SG0OdNIc6W1f013mkEu3h7fdXgr/y+s+o25bElMIpx1N8z4BsSoKUMUReljho589+ec8dkf+cw6iSnffK29Vt4b8vLyrpd54bN/Ele8n0V1Kfy0djSxRZUYLY9S4UrBM3oWYtTFOMYmEGuJI8maQIowu6gEdT9NRhP7LbVYMtwkT8ole9YYRrhOfLHy42WxWEjKTSUpNzVqZVD6jyEVyqSU/Pz17aTGOrhlYe9MZFreUs7qitWUNpdS4ztYs1Xrq8UX9h12vE2zkepMJc2ZRm5cLqeln0aqy9xOc6aR6kolNSaVZGcyNu3Yy2v4w/72WrW2r9W+6vbt3Y27WbdvHS2hw8Obw+LoFNzSXemkVnzKyOIPmCFcuM/+GZz+dXDE9cL/lKIoyjH4m+HlryN2reCZ8NnYFj/Aqe4UasuKWPnWXznw8Qfklfp5oBrCVjdN2WPxZI0jfGYa8dZE0m0JtHVI8YZbaJEemuwBHDlJpJ82khFT81Qtk9KvDalQ9tpn+9hU1sgDV00mLub41hMLG2E+q/6MDys+ZFXFKvY07QEg1hZLqjOVVGcqE1Mmtgettn1ttVRHrJ06TjHWGHLico456aEv7KPWW9se2Kq91dT6Dm4XNRSxtnI1nrAPMtKwalamtW5nzq6XmZs9l1EJ/XPYt6KcKCHEE8BFQLWUcmIXjwvgj8AFgBf4ipRyU+SxG4C7I4feK6V86uSUehCqL4Hnr0FW72KpuIEtpYl8/fnfs+H7/8VR7ycr61TSMq7EMTETaU8myZbUXgPmDXtoli00Ov24RqWTPTuf7FFqNLgy8AgZGfo7kEyfPl1u2LChR89pDYRZ+LsPyIiP4dVvzUbTuh8wmgJNrKlcw6qKVXxU+RHNwWasmpXpGdOZnz2fednzyI0f4BOlSgnPXIZ3/2a2f+FxVtdtZnXFaoobiwEY7h7O3Ky5zMmaw4zhM3q8BIminAghxEYp5fQ+eu15mN2snz5CKLsA+A5mKJsB/FFKOUMIkQxsAKYDEtgITJNSNhztfMdz/RrMDK8X34pn8b74AL5qDU+9m6b4kQSGTcCSmEmcM5VEewrWSMtBINIEGXBK7LlJZM8uIGNC92biV5Ro6e41bMjUlP3lg2IONAf4y5emHTOQSSkpaS7hw3KzNuzT6k/RpU6SI4kFOQuYnz2fMzPPJNY+iOZ1KVoBez7Adf4DnJ63iNPzFnHHtDvY37qf1ZWrWV2xmtf3vM6LRS9i02xMy5hmhrTsOYyMH6lq0ZQBS0r5oRAi7yiHXIoZ2CSwTgiRKIQYDiwA3pFS1gMIId4BFgPP90a5mpuaePZ3Szjr4u8zdvo5g+Z3LHSgGt+nm/Bu2oRv06fUVHnwDp+ElngbsRPTSLSnEG8x+3iFjRBN4QazD1hmHBnTTyHvjFNUE6QyaA2JUFZW5+Xvq0u4fGoW00YkdXlMSA+xsXojq8pXsapiFeUt5QDkJ+Vz48QbmZ8zn4kpE4+6HMeAFQ7Cf34CqfnmrPwdDHMPY0n+EpbkLyGoB9lUvYmPKj5ideVqHtzwIA9ueJCs2CzmZs1lbvZcTh92Ok5r782Fo+s6odYgvsZW/I2tBJq8BD1+Qq1+wq0BdF8I3R/CCISRIR0Z0iFsgC5BN8z6ixgrIs6OIyUWd1YyKWOGkTgyXV3Yle7KAso7bFdE9h1p/2GEEN8AvgGQm9u9WvX1Lz/OlOqrOPDIJvZ73samNZCdlYh7zBjsI/NwjBqFPS8Pzdn/5p6S4TCh/fsJlZcTLC8nVF5BsLychsIy6u1ZkJKHy51LQt5UMkebH24NadAYqmN3qJR9WoBpC6ZTsGAGec7+vWakovSmXgllQojFmH0uLMA/pJS/PuRxB/A0MA2oA66WUu6NPHYX8DVAB26VUq7ojTJ1dN9bO7Bqgh8tHttpf72/ntUVq1lVsYq1+9bSGmrFrtmZMXwGN4y/gXnZ8xgeO7y3i9P/bHgc6orh2n+D5ch97ewWOzOHz2Tm8JncftrtlNeWsW7XWraVb6Fo7VZKgjtYqj/DSMcIsu2ZpFtScBj2LgOT0CXCAGEINAkWNDQ0LFiwCgsWYcUirFiFDU0cnNzXSscfWkvk1nnklC51dCNEWIYBiAm50Bo0aACKPfhWFeMxPsdntOKXAYJaGN0uELF27CmxuDOTSBqdQcqoYWrOHwWgqyoqeZT9h++U8jHgMTCbL7tz0rzh87HEN2BPPDgVhG6Eqd7TjPfzevyBEvTWOmyhRhLjdFJGZZhhbeRI7KNGYc3I6NPaNb2piWB5BaGKg8HLV15BQ71Oq3RjuFPRnEnYYuKIsWXhshWQNCWeto/FLaFGakP7KRO1bIjbRfGoA4xIPpvXVmez9JsLmJjb9QdoRRnMTvgvjhDCAvwZOAfzk+InQohlUsodHQ77GtAgpRwthLgG+A1wtRBiPHANMAHIBN4VQuRLKfUTLVebNcW1rNh+gB+cV0BGvIPC+sL2TvpbarYgkaQ501ict5j52fMHZX8pPRjGW9eCp6YZX50Hf6M5D06oNYDe4kXua0Ja7kc82YjQ/w8tEpQ0NDSpYRGRuCTabm2BSWMOuczhkE/+hw/07FweI4wuw4Rl2AxQhNGlgSEMQoQxkBgCdM0gJHRCmk5AC+ITQVqFl0bZQiNNeKx+Wq1eWqw+Wh0+rAkO4pMTGJacyXD3cLJizUqL1SUrKC8sIbMplTx/JnnGcJKJw2nYsUsr8TIWZ9iNpckCTcAeL8GPSqiQxfh1L37pJyhChO0C4bZhS3bjykwkadQwUgqGY7MfOcjquo4R1An6goS9AYLeAGF/iLA/RMgXQA+E0ANhjGCYcCCMDIUxQuZzjLCODOvIsIHUDTAk1oQYXJnJJI0eRurYzKOeW+k1FUDHTkvZwL7I/gWH7P+gt0465vxpNM8P8PVfL+dS/+cMC/nQZRpxJBDvSCDdnYMl5WBtb2uTjwOfNONd8zlB38dIXz1ui5fUdBuxo0e0hzX7iBHdql2ToRChqqr2wBWqKMdbWklDjR9PyIFuT+gQuuJxWc/Amb6QjIyDH6KklPj0VnyGlyY81Dt92IdZ+Lz1jzyVUE2V1cLoxNHcOPFG7htxHuf9YQ1Tc+xMVYFMGaJ6oxrgDKBYSrkHQAjxAmYfjI6h7FLgZ5H7LwF/ioxouhR4QUoZAEqEEMWR1/u4F8pFWDf41bL1DB+2l1rHJs57eTVVrVUATEiZwDenfJN5OfMYlzyuU21MfxHyBfHWtdBa24yv3kOw2Uew2UvYY/6Bl/4QMqhDWKKFJZohsEgNCxo2zFomq2bDJuztn5jtkZtZw+Qyb05zfpyQHiRkBNFlGB0dHTMohdExRBBDSKQGaAJpEWAVCKsFYdMQdiua3YolxoYlxoZX81MerqTIt4vtrTuptzYRigkzNmcCc/LmMjtzNhYklZ5K9nn2mbdW82ulp5Iabw2yQ6WDJjSGuYaRGZtJZmwmWbEFTIkEr8zYTDLcGUecQuTyMZfjX+hnXdU6VpatZGn5CzQEGrBpNmYOn8nC3IXMHTYNbb9BQ/EBPJV1BOs8SE8QiyGxGRZiceMMu7C22MzQWRog/HEpVbIEv+5Fl2E0oSHQ0IQFTURq/oS1y9oK0f59OFRb7d8RtAAVQfT/llEl95p/8KSPoAijO4TZTJsWT2xuCunjsokdnqiaaU/cMuCWyLVtBtAkpawSQqwAfiWEaEsQ5wJ39eaJ410ObvzCDG5+1sr9ixP4Ys0faNrzHm9nT+DV2FRse+2Mbx7JOH0kqcTj1hykuIbjih/T/hpSSur3tOApbMIf+ICQrwFLqIk4V4i03CScY0ZhiU8gVFmJr7SCuqpWPD6NsOZGi0mMhK5YXNZxOF2nk5ankdbhtdtDl+ah3uZFS4zBOSyBxFOGkT4hh5h4MwA2+Bt4Yc29/Kt0OY0pGqcljOXu6d9lbtZchBC8t/MAe+u83HFuQW/+FyrKgHLCoy+FEFcBi6WUX49sXwfMkFLe0uGYbZFjKiLbuzEvbj8D1kkpn43sfxx4W0r50tHO2d3RSyu+9RAjnKM71MjoGJjBotPNIsCiIWwdAoajLWDYsbnsWN0OHLFO7LExOBJcOBPd2Nz2Tn/wdF3H3+TDW9tWI9VKsNlHyOMn7A1g+My+TwR1swkvLLEYAk2aYcoqLFgjTXZtgao7QoYZpsIyTFiG0IVh3jSJtIC0amC3oMVYsbgcWN0O7PFOHBYPzo9/invyXFxX3dtntS7+sJ9P9n/CR5VmX7S2/nodWYSFYe5I6HJntoettlu6K71b87Z1h27ofFr9KSvLV7KybCWVnkoEgilpU1iYu5CFuQsZET/i8OfpOs1ltdTuqsJTUU+wxoPhCaD5DTQpkEIihfkzhQCpCWi7WTSERYAlEmStGppVQ1gtaDYrmk1Ds9mwxFix2K1YHTYsDhvWGBvWGDs2pw3NolFfUk1LaS2B6haMlgCWgIHdsBIjYnBa3FhE5wAWMoL49Fb8BAhZDYwYC5YkJ86MRBJPySBtbFb7H83+rI9HXz6PWeOVChwA7gFsAFLKRyMfIP+E2YnfC3xVSrkh8twbgR9HXuo+KeWTxzpfT0dfSin5+lMb+HhPHe/ePo/MsmWw/E4ItvL5jK+xND6WN0repjnYTKY7k0tHX8q58YswPvfStHs/4RoPFq+B07ATa43Hph38OBA2QnjCzYT0AE6rG1dkLcWO524LXQFLGN2hHTF0dRQ2wuxu3M3mms1srd3K1urN7GkuQQILdBs3LrifqaPO6/ScL/9jPcXVHlb/6Cxslv73IVlRTkR3r2G9EcqWAOcdEsrOkFJ+p8Mx2yPHdAxlZwC/AD4+JJS9JaV8uYvzdOwoO620tPSYZXvj9gdJCaVGmtssaMKKRbO0b1s0K1ZhxXJIv6XuMqRh1ipJHU1oh/V/OhozRIUIG2HCmE15hjDQhcSwRIKiTUPYLQiHFYvTjtVlx57gMkNhSizu1Hhc6fHHH6aeWwJl6+HWTeA+ebNJlzaXsr5qPTHWGDLdB0OXVTv5/beklBQ1FLGyfCXvl73PzvqdAJyScEp7QJuQMmFAjHzTg2Fqi/dTv2sfrZUNhOu90BrEGhQ4sOHUXMRYDm+aN//o+swmWhtIpxVh1xA2qxkSHbb2nz+b24Hd7cQR7zzih5O+0Jeh7GQ7nikxyuu9nPOHVczPT+Nv100HTw0s/xFsexnSJxC46He8rzfxyq5XWFe1DoAZw2dwxZgrWJi7EIfFAZgfLGoLq6jeXIq3rA6j0Y89ABYsZt/KmO6FrkNVe6vZWrOVzbWb2Vqzle1129snz07U7Ez2tjLJ18rZw2cz+vInwN7557BwfwvnPfQhPzivgG+f1TsTeytKf3IyQ9ks4GdSyvMi23cBSCnv73DMisgxHwshrMB+IA24s+OxHY872jl7dFHbuwaeW4J0ZxBa9CiBGi/Bkj0E9uwhuKeE4J496E1NhDUrYUccemwiIjMX0jIRiSnI2ESIcSOtdmQYjGCk03rYbDZs67SOiNRI2TSEw2LWsrXVSsXFYE9w4UqOw50aR0xKbPT7AhW/C89eCefeC2d+59jHDxH7PPt4v/x9VpatZOOBjehSJ92VzsIcM6BNHza912rsosHX4KF6RyVNe6vxH2hCb/Kj+XRsuoUYHLgs7m7X0LY5+OEk3P4hpb35GwNDSPPWqelbwz0mnclfmtutcwz1UAbmtD4PLC/k8Rums2hchrmz8G144w7w7IeZ34Kzfsy+YBOvFb/Gq8Wvsq91H/H2eC4cdSGXj76ccSnjjn6SbvCFfeys28nW2q3tNWH7W/cDYNWsjE0ay+TYbCZVlzBl90dkB/yIcReb15mcM7p8zbte2cIrmypZd9ciktxqtKUy+JzMUGYFioBFQCXwCXCtlHJ7h2O+DUySUt4c6eh/hZTyC0KICcC/MGvNMoH3gDHH6ujf44ta2XozgLhT4IbXIbFzx/RwQwPBPZ2DWqCkhFBFBRhG+3HW4cMPdpYdNdIckj5yJNb09AFRk9JOD8OjsyEcgG+vB6sj2iXqlxr9jXxY+SEry1aypnINft1PnC2OeTnzWJizkNlZs3Hb+m791GjQdR1vXQvBZh++Zh/BFrP5PdQaQPcF0X0hwoEQMhhGBg//cKIZIKTZJK9JYdZIox0yQMSsUS7Xqpj1qy90q1wqlEEwbHDhw6vxBnXevWM+TnukdtLfBO/cAxufhMQRcMnDMGoBhjRYX7WepcVLea/0PYJGkHHJ47hs9GVcOOpCEhzHXsvWkAalzaVsrd3KlpotbKnZwq6GXe0jm7Nis5iUOonJaZOZlDqJcc21ONY9CsXvgNUJU78Ms74FyaOOeI761iCz7n+PK07L5v4rJvX4/0VRBoKTFsoiJ7sAeAizh/ITUsr7hBC/ADZIKZcJIWKAZ4CpQD1wTYeBAT8BbgTCwHellG8f63zHdVGr2AjPXG4uqv2V1yEp75hPMYJBQqWlBPaUHFa7Zni97cdpbje2EbnYc3Kx5+Zgy8nBnpuLPScH67BhiP7W0fqTf8Cb34Orn4NxF0W7NAOCL+xj3b51vFf2HqsqVtEYaMSu2ZmZOZOFOQspSC7AqpnN4tZIs7hVM5vLrZq18z5hGZzz3fVAwOtHhmW3+7OpUGZav6eOqx9bxzcXnHLYFD/s/QiW3Qr1u80wdO694DTHIDQFmnir5C2W7lrKzvqd2DU7i3IXcfmYy5kxfEZ7t4tGf6PZBywSwrbWbqU52AyA2+ZmYsrE9gA2KW0Sqc5U0EOw/VVY+zDs3wLuNDjjJjj9a+BKPuZ7+vP7xTy4opD/3D6P/Ay1zq4yOJ3UUHayHfdFbd+n8PRlYHebNWYppxzX+aWUhKurCZaUmEFt9x6CZWWEysoI7tsHoVD7scJmw5adjS0357DQZsvORnOc5FoqXyM8PBUyJpj/BwOphq+fCBthc6BA2UreL3+fSk9lj19DILBoFmyarT3ItQe6DiGuPdQJK3aLnRHxI8hPymds8ljyk/IH16oSR6FC2UHf//dmXv20krdum3t4iAn54INfw9pHzH6iF/wWxl/S6ZCddTtZWryUN/e82T44YHLaZHbW76S02eyrKxCMThrN5NTJ7SFsVMKozh8m/M2w6WlY91dorjAnn551C0y+Gmyd5w48kpBuMOc3K8nPiOOZr8047v8TRenvVCg7kv1b4alLzCa7G16H1DHHfk4PSF0nVLWfUHkZwbLy9q/B8nJCZWUYra0HDxYCa0YG9pycQ0Kb+dWScOzmhR5b8RP4+M9w04cwfHLvv/4Q0zZQYH/rfnPQhgwTNsx+VWEj3H5r29alTsgIoRv64cfJcPv+9tcx9Pb9vrCPPU17aAw0tp8/KzaLgqQCCpILKEgqID85n6zYrH45xcuJUKHsoDpPgIW/W0VBRhz/d9PMrrtO7PsMlt1iXu/GXWKGs7iMTocE9AAry1byyq5XKGkqYXzKeCanTWZy6mQmpE44ctN8UyWsfxQ2/hMCzZA31+wvNvoc0Hr2c/faZ5Xc9sJnPPGV6Swcm3HsJyjKAKVC2dEc2AFPXwIIM5iljz3mU3qDlBK9oYFgaam5/MghoU2vre10vJaQgD0npz2o2TIzERYNaZgTiSKNw+/rRuS+NPvDdTymtQ75yeOQNh5Gn33IMQfvay4X9ry89pslJWVg9ZkbxKSUHPAeoKihiML6QgobCimsL6SspQxDmv0f3TY3+Un55Cflt4e10YmjT/qkyIY0qPfXc8B7gOrWaqq91eZ9P7lPIgAAFapJREFUr3n/rNyz+OLYL3brtVQo6+yF/5Zx5ytbefCqySyZfoTFuPWQWWP2wa/Nmqtz7zObNY/3d3n/Vlj7J9j2EkgJEy4za8ayTjvu93HZn9fQ5Avx3h3zj7kmsaIMZCqUHUtNITx1MRg63LDMbM6LMqO1lWBFRaQptJxgeeRrWRmhqirQe2GhAyERVrv5iVbTzLB1yH3D40F2aILVYmM7hbSDtxFYYodG81l/5wv7KG4obg9pRQ1FFDUU4Ql5ALM5Kjc+t1OtWkFyARmu41uKxxvytoerjkGr2ltNtc/8Wuutbe8Q3sYiLKQ6U0l3pXPxKRerUHacDENy1aNr2Vvn5b075h99xGLtLrOvWdlaGLUALnoIkkd270RSwu6VZrjb8z7Y3DDtBphxMyQdPpdfT2wqa+CKv6zlF5dO4PpZeSf0WorS36lQ1h21xWYwC/vh+tf6dXOeDIUIt9WkaRoIgYiEqY732/cdErjYuxrx9CWw6H9h7veOfi5dN5dXKdlLcG/nW2jfPvNCHWFJS8UxIg/7yM6BzZaTg2ZXQ9ujSUpzxYTChkKK6ovaA1uFp6L9mHh7PAXJBWatWqT5M82ZRo235sihy1tNS+jwtbRibbGku9LbbxmujMPuJ8ckH9cgBxXKDrezqpmLHvmIJdOy+fWVx7h2GYY5OvOde0DqsPBuM1gd6XsRDppzoK19BKq3Q+wwmHkzTPtK++CBE3XLvzaxqqiGdXctwu1Qa8wqg5sKZd1Vv8fsYxZogeuWnlBVfL9l6PC3+ebQ+Vs+6XYn3C5fKhAgVFZGoFNYKyW4dy96Xd3BAzUNW1ZWp1o1e14ejrw8rMOHm+FRiQpP0MOuxl3tzZ9F9UXsatzVPtnnoSzCQoozpVPI6ip09WXzqAplXfvVWzt57MM9vPzNWUwbceyRjjRVwpt3QNFyyJoGl/wJMsYffNzXaPYVW/8otFRB+nizv9jEq8Daex+yqpp8zPnN+9w4O4+fXDj+2E9QlAFOhbKeaCiFpy4CXxNc9wpkD4pr/0GbnoZl34GrnoSJV/TZafTmZoKlZkA7tJat4xQiwm7HPiIXS1IyWmwsmtuNFuvG0nbfHWvuj3Vjcbsj9zs85nKqUNfLdEOnvKWcwoZCGvwNpLnS2kNXSkxK1KfwUKGsa62BMOf8fhXxThuvf2dO95YnktKsBXv7h+YIyrl3mCMmP3kcNj0FQY/ZzHnmd+CURX0yQvs3yz/nb6t2s+oHZ5GTfHL7OipKNKhQ1lON5WZTZmstfPklyJ3Zu68fLYEWePg0c/LGG5dHZQoMKSXhmprONWulpehNjRieVozWVgyP57C+bEckBJrL1SmsWWIjga09xLnN/XHxWNNSsaalmbeUFIRqVh1wVCg7shXb93PTMxv5yQXj+J95R56k9TCtdbDiLtjyf+a2ZoWJV5qd9/uwK4cvqDPz/veYNSqFR6+b1mfnUZT+pLvXMNWQ3yYxB776lhnMnrkCvvQi5M2JdqlO3OrfQ2s1XPtC1OYkE0JgS0/Hlp6O+4yul1lpYwSDB0Na5Kvefr/D/ta2/d72QBeuqUVv9bQHvSMNjLAkJh4MaWlpWNPTOm+nmiFOcw+u2fqVwenc8RksGpvOH94t4sLJw8lM7OYC8+4UuOIxmPwFqNps1pYlZPdtYYGln1bS5Atx45xuDjZQlCFEhbKO4jPhK2+afcyevcoMMqMWRLtUx6+h1JyTbPI1Zv+RAUCz280BAkkn1plYSon0+9GbmwnX1BKuqSZcU9PhVku4poZASYk5gKKLGjrN5eoyuFlSUzuFOEtiopoyRIkaIQQ/u2QC5/xhFT9/fbu5YHlPjD7bvJ0EUkqeXFPChMx4Ts/rnQEDijKYqFB2qLhhZjB7+hL419VwzXMn7YLV6969xxxdteh/o12Sk04IgXA60ZxObBkZwJGnPJFSojc2HhLaOt9827ej19R26hvXfi6bDc3lOjjSVRMIDplqpH0krEAIrX1baAI6brcdJ8TBY9tG2Fqt2EeMwJGfT0xBPo78/L6ZYFgZcHKSXdy6aAwPLC/k3R0HOHt8/5yI9aPiWnZVe/jdkinqg4yidEGFsq7EpsENb8Azl8LzX4Srn4X886Jdqp4pWwfbl8KCuyAhK9ql6deEEFiTkrAmJUF+/lGPNVpbuwxthtcHyM6T+Upp3m+boLfDtpQGSLqYvFeaj3WxLQMBWlasoPHFF9vLYx02DEf+GGIKCnDk5+PIL8AxMk/1mxuCvj5nFEs3VXLPsu2cOToFl73/Xd6f+KiE1FgHF00ZHu2iKEq/1P9+a/sLdwpcv8xcxPyFL8EXnoKxF0a7VN1jGLD8TojLNEdQKb1Gc7uxu93Y8/Kicv62dVcDRUUECgvxFxURKCyi7uN1B5tgbTYcI0eaIa0gn5j8fBwFBVgzjm+iWGVgsFs17r1sIlc/to5HVhYfvmB5lO2u8fB+YQ3fPXsMDmt0R/MqSn+lQtnRuJLNSWWfvRJevB6uegLGXxrtUh3b1hfNxdcvf8xcfF0ZNIQQ2DIysGVkEDt3bvt+GQoRKCkhULSLQGEhgaIivBs30vzGG+3HaPHxZkCLhDRH/hgcY/KxxKqfkcFixqgUrpqWzd8/3MPlU7MOX7A8ip5auxe7ReNLM05sJQBFGcxUKDsWZ6I5qexzV8G/vwpX/t0cNt5fBVvh3Z9B5mkwaUm0S6OcJMJmIybfrBXjooM1unpTE4Fdu9pr1AJFRTS99po5OjXClp3dHtJiCgqwZWVH+rNFatXa+sS117IJ89+hj7fdjzxubh7yWIdtS2wslsTEPvofGbruOn8s7+48wN1Ltx15wfKTKKQb/P6dIp5ZV8qSadmkxTmiWh5F6c9UKOuOmHj48stmx/+Xvw56GKZcHe1SdW3Nw+ZM3EueMjuIK0OaJSEB1/TpuKYfHJEnpSRUuY9AkVmj5i8sJFBYhOf9982m75Mk+YYbyLjrzpN2vqEiJdbBnYvHcucrW3lpY8WRFyw/CUrrWrn1+U/ZXNHENafn8L8Xq9n7FeVoVCjrLkccfOnf8Pw1sPQmMEIw9cvRLlVnTZWw5o8w4QrInRHt0ij9lBACe3YW9uws4hYubN9v+P0Edu8mfOCAOet7ZGJp2eE+ksj9tu1Dj6PD2qgdnycPPh7Zdow+pS/f5pD2hek5/HtjBfe//Tlnj8s4+oLlfeSVTRX89NVtWDTBX750GhdMUp37FeVYVCjrCbsbrn0RXrgWXvs26CGY/tVol+qg934O0oBzfh7tkigDkBYTg3PCBJhw5OlDlIFB0wT3XjaRix75iN8s//zYC5b3ohZ/iJ++uo1XP9vHGXnJ/OGaU8nq7oS2ijLEqfatnrI54ZrnYcy58MZ34b9/j3aJTBUbzeVSzrwFEnOjXRpFUaJs3PB4vjZnJC98Us6GvfUn5Zybyhq44OHVvL6lijvOyef5b8xUgUxRekCFsuNhizHnLiu4EN76Pnz8l+iWR0pzDbvYDJhze3TLoihKv3HbojFkJsRw96vbCOl9119QNyR/WrmLJY9+jJTw4k0zuXXRGCyamoJFUXpChbLjZXXAkn/CuEvMQPTG7dBYFp2ybH8FytfDwp+afd8URVEAt8PKPZdM4PP9LTy5pqRPzlHV5ONL/1jHb/9TxAWThvPWbXOZNiK5T86lKIPdCYUyIUSyEOIdIcSuyNcuFzMTQtwQOWaXEOKGDvvvE0KUCyE8J1KOqLHa4aon4fT/gU1Pwx9PhVduggM7Tl4ZQj545x4YNglOvfbknVdRlAHh3PEZnD0unYfe3UVlo69XX3v5tv0sfmg1Wyqa+O2SKTx8zanEx9h69RyKMpScaE3ZncB7UsoxwHuR7U6EEMnAPcAM4Azgng7h7fXIvoHLYoULfwu3bYYZN8PO1+Gvs8zpM0o/7vvzf/xnaCqH8+4317lUFEXpQAjBPRdPwJCSny/b3iuv6Qvq/HjpVm5+diMjUly8eetcrpqWHfU50RRloDvRUHYp8FTk/lPAZV0ccx7wjpSyXkrZALwDLAaQUq6TUladYBn6h4RsWPwruH0bnPUTKP8vPLkYHj8PCt/um/mfWvbD6t/D2Itg5NxjH68oypCUk+zitkX5/GfHAd7dceCEXmvHvmYu/tNH/Gt9GTfNH8VLN5/JyFS1KoSi9IYTDWUZbaEq8jW9i2OygPIO2xWRfYOTKxnm/xBu3w7nPwjN+8y5zf56Jnz2vDmNRm9Z+UvQg3DuL3vvNRVFGZS+NmckY9JjuWfZdrzBcI+fL6XkyTUlXPbnNTT7Qjz7tRncdf447FbVNVlRessxf5uEEO8KIbZ1cevuIpBd1WfLLvYdqxzfEEJsEEJsqKmp6enTTz67C2Z8A27dBFf83Vxa5tWbzX5n6/5qLod0Iqo2w6fPwcybIXlU75RZUZRBq23B8spGH4+sLO7Rc2s9AW785yf8/PUdzMtP5e3b5jJnTGoflVRRhq5jhjIp5dlSyold3F4DDgghhgNEvlZ38RIVQMd1PrKBfT0tqJTyMSnldCnl9LS0tJ4+PXosNpj8BfjmWrj23+YcYsvvhD9MgPfvh9a6nr+mlLD8x2at3Lwf9H6ZFUUZlDouWF50oKVbz/mwqIbFD61mze46fnHpBP5+/XRSYtX6lYrSF0603nkZ0Daa8gbgtS6OWQGcK4RIinTwPzeyb2gRAvLPhRvfhhv/A7mzYNWv4aGJ8PaPejadxudvQOlHZt+1mIS+K7OiKIPOXeePJTbGyt1Lt5lLXx1BMGxw35s7uP6J/5LstrHsltlcPytPdeZXlD50oqHs18A5QohdwDmRbYQQ04UQ/wCQUtYDvwQ+idx+EdmHEOIBIUQF4BJCVAghfnaC5RkYcmfAF5+Hb62H8ZfBJ/+Ah6d2bzqNcAD+czekjYPTbjj6sYqiKIdIiXVw1/lj+e/eel7aWNHlMbtrPFzx1zX8fXUJ180cwbJb5jB2WPxJLqmiDD3iaJ+U+qvp06fLDRs2RLsYvaexHNb9BTY+BaFWyF8Ms78LI2Ydfuyah+Gdn8J1S+GUhYc/riiDkBBio5RyerTL0Rv6w/XLMCRL/vYxe2o8rPzegvYFy6WU/HtDBfcs247DpvHAlZM5d8KwqJZVUQaD7l7D1LCZ/iAxBxbfb06nseDHh0ynsfzgdBqeGvjwQRhzngpkiqIcN00T3Hf5RJr9YX6z/HMAmnwhbnn+U3748ham5iay/LZ5KpApyklmjXYBlA5cybDgR+ai4p8+C2sfgeevNpsqZ98GZWsh5IVz7412SRVFGeDGDjMXLH/swz3kZ8Tx+EclHGj288PFBdw07xS1bqWiRIEKZf2R3Q0zboLpN8K2V2DNQ+Z0GmCuGpCWH93yKYoyKNy2aAxvbN7HL97YwYgUFy9980xOzUmMdrEUZchSoaw/s9hgytXmlBq7/gPF78KCw1ayUhRFOS5uh5VHrp3Kuzur+fZZo4l1qD8JihJN6jdwIBAC8s8zb4qi9CohxGLgj4AF+IeU8teHPD4CeAJIA+qBL0spKyKP6cDWyKFlUspLTlrBe8m0EclMG5Ec7WIoioIKZYqiDGFCCAvwZ8wpfSqAT4QQy6SUHeem+S3wtJTyKSHEQuB+4LrIYz4p5akntdCKogxaavSloihD2RlAsZRyj5QyCLwAHLqE3Hjgvcj997t4XFEUpVeoUKYoylCWBZR32K6I7OtoM3Bl5P7lQJwQIiWyHRNZk3edEOKyvi2qoiiDnQpliqIMZV3N+3DojNrfB+YLIT4F5gOVQDjyWG5kQshrgYeEEKd0eRIhvhEJbxtqamp6qeiKogw2KpQpijKUVQA5HbazgX0dD5BS7pNSXiGlnAr8JLKvqe2xyNc9wAfA1K5OIqV8TEo5XUo5PS0trdffhKIog4MKZYqiDGWfAGOEECOFEHbgGmBZxwOEEKlCiLZr5V2YIzERQiQJIRxtxwCzgWMsXqsoinJkKpQpijJkSSnDwC3ACmAn8KKUcrsQ4hdCiLbpLRYAhUKIIiADuC+yfxywQQixGXMAwK8PGbWpKIrSI2pKDEVRhjQp5VvAW4fs+98O918CXurieWuBSX1eQEVRhgwh5aF9Wvs/IUQNUNrNw1OB2j4szsk0mN4LDK73o95L3xohpRwUnbF6eP2C/vn9OF7qvfRPg+m9QP98P926hg3IUNYTQogNkdFRA95gei8wuN6Pei9KXxlM3w/1XvqnwfReYGC/H9WnTFEURVEUpR9QoUxRFEVRFKUfGAqh7LFoF6AXDab3AoPr/aj3ovSVwfT9UO+lfxpM7wUG8PsZ9H3KFEVRFEVRBoKhUFOmKIqiKIrS7w3qUCaEWCyEKBRCFAsh7ox2eY6XECJHCPG+EGKnEGK7EOK2aJfpRAkhLEKIT4UQb0S7LCdKCJEohHhJCPF55Hs0K9plOl5CiNsjP2PbhBDPCyFiol2moUpdv/ovdf3qnwbD9WvQhjIhhAX4M3A+MB74ohBifHRLddzCwPeklOOAmcC3B/B7aXMb5gzqg8EfgeVSyrHAFAbo+xJCZAG3AtOllBMBC+ayQ8pJpq5f/Z66fvUzg+X6NWhDGXAGUCyl3COlDAIvAJdGuUzHRUpZJaXcFLnfgvlLkxXdUh0/IUQ2cCHwj2iX5UQJIeKBecDjAFLKoJSyMbqlOiFWwCmEsAIuDlmcWzlp1PWrn1LXr35twF+/BnMoywLKO2xXMIAvBG2EEHnAVGB9dEtyQh4CfggY0S5ILxgF1ABPRpoz/iGEcEe7UMdDSlkJ/BYoA6qAJinlf6JbqiFLXb/6L3X96ocGy/VrMIcy0cW+AT3UVAgRC7wMfFdK2Rzt8hwPIcRFQLWUcmO0y9JLrMBpwF+llFOBVmBA9v8RQiRh1saMBDIBtxDiy9Et1ZClrl/9kLp+9V+D5fo1mENZBZDTYTubAViV2UYIYcO8oD0npXwl2uU5AbOBS4QQezGbZBYKIZ6NbpFOSAVQIaVs++T/EuZFbiA6GyiRUtZIKUPAK8CZUS7TUKWuX/2Tun71X4Pi+jWYQ9knwBghxEghhB2zw9+yKJfpuAghBGab/04p5e+jXZ4TIaW8S0qZLaXMw/yerJRSDrhPM22klPuBciFEQWTXImBHFIt0IsqAmUIIV+RnbhEDtNPvIKCuX/2Qun71a4Pi+mWNdgH6ipQyLIS4BViBOQrjCSnl9igX63jNBq4DtgohPovs+7GU8q0olkk56DvAc5E/nnuAr0a5PMdFSrleCPESsAlzxNynDOCZsQcydf1STiJ1/epH1Iz+iqIoiqIo/cBgbr5UFEVRFEUZMFQoUxRFURRF6QdUKFMURVEURekHVChTFEVRFEXpB1QoUxRFURRF6QdUKFMURVEURekHVChTFEVRFEXpB1QoUxRFURRF6Qf+H+Twho6mViqOAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with Hooks(learn.model, append_stats) as hooks:\n",
    "    run.fit(1, learn)\n",
    "    fig,(ax0,ax1) = plt.subplots(1,2, figsize=(10,4))\n",
    "    for h in hooks[:-1]:\n",
    "        ms,ss = h.stats\n",
    "        ax0.plot(ms[:10])\n",
    "        ax1.plot(ss[:10])\n",
    "        h.remove()\n",
    "    plt.legend(range(6));\n",
    "    \n",
    "    fig,(ax0,ax1) = plt.subplots(1,2, figsize=(10,4))\n",
    "    for h in hooks[:-1]:\n",
    "        ms,ss = h.stats\n",
    "        ax0.plot(ms)\n",
    "        ax1.plot(ss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 1.0, conv_layer, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.27833810546875, tensor(0.9105, device='cuda:0')]\n",
      "valid: [0.1912491943359375, tensor(0.9386, device='cuda:0')]\n",
      "train: [0.08977265625, tensor(0.9713, device='cuda:0')]\n",
      "valid: [0.09156090698242188, tensor(0.9716, device='cuda:0')]\n",
      "train: [0.06145498046875, tensor(0.9810, device='cuda:0')]\n",
      "valid: [0.09970919799804688, tensor(0.9707, device='cuda:0')]\n",
      "CPU times: user 3.71 s, sys: 584 ms, total: 4.29 s\n",
      "Wall time: 4.29 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Builtin batchnorm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=6679)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def conv_layer(ni, nf, ks=3, stride=2, bn=True, **kwargs):\n",
    "    layers = [nn.Conv2d(ni, nf, ks, padding=ks//2, stride=stride, bias=not bn),\n",
    "              GeneralRelu(**kwargs)]\n",
    "    if bn: layers.append(nn.BatchNorm2d(nf, eps=1e-5, momentum=0.1))\n",
    "    return nn.Sequential(*layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 1., conv_layer, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.27115255859375, tensor(0.9206, device='cuda:0')]\n",
      "valid: [0.1547997314453125, tensor(0.9496, device='cuda:0')]\n",
      "train: [0.07861462890625, tensor(0.9755, device='cuda:0')]\n",
      "valid: [0.07472044067382813, tensor(0.9776, device='cuda:0')]\n",
      "train: [0.0570835498046875, tensor(0.9818, device='cuda:0')]\n",
      "valid: [0.0673232666015625, tensor(0.9813, device='cuda:0')]\n",
      "CPU times: user 3.37 s, sys: 747 ms, total: 4.12 s\n",
      "Wall time: 4.12 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### With scheduler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's add the usual warm-up/annealing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sched = combine_scheds([0.3, 0.7], [sched_lin(0.6, 2.), sched_lin(2., 0.1)]) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.9, conv_layer, cbs=cbfs\n",
    "                          +[partial(ParamScheduler,'lr', sched)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.2881914453125, tensor(0.9116, device='cuda:0')]\n",
      "valid: [0.5269224609375, tensor(0.8394, device='cuda:0')]\n",
      "train: [0.153792421875, tensor(0.9551, device='cuda:0')]\n",
      "valid: [0.462953662109375, tensor(0.8514, device='cuda:0')]\n",
      "train: [0.087637158203125, tensor(0.9736, device='cuda:0')]\n",
      "valid: [0.07029829711914062, tensor(0.9788, device='cuda:0')]\n",
      "train: [0.049282421875, tensor(0.9853, device='cuda:0')]\n",
      "valid: [0.08710025024414063, tensor(0.9740, device='cuda:0')]\n",
      "train: [0.0356986328125, tensor(0.9888, device='cuda:0')]\n",
      "valid: [0.07853966674804687, tensor(0.9773, device='cuda:0')]\n",
      "train: [0.0268300439453125, tensor(0.9918, device='cuda:0')]\n",
      "valid: [0.04807376098632812, tensor(0.9870, device='cuda:0')]\n",
      "train: [0.0219412109375, tensor(0.9939, device='cuda:0')]\n",
      "valid: [0.04363873901367187, tensor(0.9882, device='cuda:0')]\n",
      "train: [0.018501048583984374, tensor(0.9951, device='cuda:0')]\n",
      "valid: [0.04355916137695313, tensor(0.9877, device='cuda:0')]\n"
     ]
    }
   ],
   "source": [
    "run.fit(8, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## More norms"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Layer norm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From [the paper](https://arxiv.org/abs/1607.06450): \"*batch normalization cannot be applied to online learning tasks or to extremely large distributed models where the minibatches have to be small*\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "General equation for a norm layer with learnable affine:\n",
    "\n",
    "$$y = \\frac{x - \\mathrm{E}[x]}{ \\sqrt{\\mathrm{Var}[x] + \\epsilon}} * \\gamma + \\beta$$\n",
    "\n",
    "The difference with BatchNorm is\n",
    "1. we don't keep a moving average\n",
    "2. we don't average over the batches dimension but over the hidden dimension, so it's independent of the batch size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=6717)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LayerNorm(nn.Module):\n",
    "    __constants__ = ['eps']\n",
    "    def __init__(self, eps=1e-5):\n",
    "        super().__init__()\n",
    "        self.eps = eps\n",
    "        self.mult = nn.Parameter(tensor(1.))\n",
    "        self.add  = nn.Parameter(tensor(0.))\n",
    "\n",
    "    def forward(self, x):\n",
    "        m = x.mean((1,2,3), keepdim=True)\n",
    "        v = x.var ((1,2,3), keepdim=True)\n",
    "        x = (x-m) / ((v+self.eps).sqrt())\n",
    "        return x*self.mult + self.add"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv_ln(ni, nf, ks=3, stride=2, bn=True, **kwargs):\n",
    "    layers = [nn.Conv2d(ni, nf, ks, padding=ks//2, stride=stride, bias=True),\n",
    "              GeneralRelu(**kwargs)]\n",
    "    if bn: layers.append(LayerNorm())\n",
    "    return nn.Sequential(*layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.8, conv_ln, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [nan, tensor(0.1321, device='cuda:0')]\n",
      "valid: [nan, tensor(0.0991, device='cuda:0')]\n",
      "train: [nan, tensor(0.0986, device='cuda:0')]\n",
      "valid: [nan, tensor(0.0991, device='cuda:0')]\n",
      "train: [nan, tensor(0.0986, device='cuda:0')]\n",
      "valid: [nan, tensor(0.0991, device='cuda:0')]\n",
      "CPU times: user 4.56 s, sys: 862 ms, total: 5.42 s\n",
      "Wall time: 5.42 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Thought experiment*: can this distinguish foggy days from sunny days (assuming you're using it before the first conv)?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Instance norm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From [the paper](https://arxiv.org/abs/1607.08022): "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The key difference between **contrast** and batch normalization is that the latter applies the normalization to a  whole batch of images instead for single ones:\n",
    "\n",
    "\\begin{equation}\\label{eq:bnorm}\n",
    "    y_{tijk} =  \\frac{x_{tijk} - \\mu_{i}}{\\sqrt{\\sigma_i^2 + \\epsilon}},\n",
    "    \\quad\n",
    "    \\mu_i = \\frac{1}{HWT}\\sum_{t=1}^T\\sum_{l=1}^W \\sum_{m=1}^H x_{tilm},\n",
    "    \\quad\n",
    "    \\sigma_i^2 = \\frac{1}{HWT}\\sum_{t=1}^T\\sum_{l=1}^W \\sum_{m=1}^H (x_{tilm} - mu_i)^2.\n",
    "\\end{equation}\n",
    "\n",
    "In order to combine the effects of instance-specific normalization and batch normalization, we propose to replace the latter by the *instance normalization* (also known as *contrast normalization*) layer:\n",
    "\n",
    "\\begin{equation}\\label{eq:inorm}\n",
    "    y_{tijk} =  \\frac{x_{tijk} - \\mu_{ti}}{\\sqrt{\\sigma_{ti}^2 + \\epsilon}},\n",
    "    \\quad\n",
    "    \\mu_{ti} = \\frac{1}{HW}\\sum_{l=1}^W \\sum_{m=1}^H x_{tilm},\n",
    "    \\quad\n",
    "    \\sigma_{ti}^2 = \\frac{1}{HW}\\sum_{l=1}^W \\sum_{m=1}^H (x_{tilm} - mu_{ti})^2.\n",
    "\\end{equation}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=7114)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class InstanceNorm(nn.Module):\n",
    "    __constants__ = ['eps']\n",
    "    def __init__(self, nf, eps=1e-0):\n",
    "        super().__init__()\n",
    "        self.eps = eps\n",
    "        self.mults = nn.Parameter(torch.ones (nf,1,1))\n",
    "        self.adds  = nn.Parameter(torch.zeros(nf,1,1))\n",
    "\n",
    "    def forward(self, x):\n",
    "        m = x.mean((2,3), keepdim=True)\n",
    "        v = x.var ((2,3), keepdim=True)\n",
    "        res = (x-m) / ((v+self.eps).sqrt())\n",
    "        return res*self.mults + self.adds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv_in(ni, nf, ks=3, stride=2, bn=True, **kwargs):\n",
    "    layers = [nn.Conv2d(ni, nf, ks, padding=ks//2, stride=stride, bias=True),\n",
    "              GeneralRelu(**kwargs)]\n",
    "    if bn: layers.append(InstanceNorm(nf))\n",
    "    return nn.Sequential(*layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.1, conv_in, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [nan, tensor(0.0986, device='cuda:0')]\n",
      "valid: [nan, tensor(0.0991, device='cuda:0')]\n",
      "train: [nan, tensor(0.0986, device='cuda:0')]\n",
      "valid: [nan, tensor(0.0991, device='cuda:0')]\n",
      "train: [nan, tensor(0.0986, device='cuda:0')]\n",
      "valid: [nan, tensor(0.0991, device='cuda:0')]\n",
      "CPU times: user 4.46 s, sys: 718 ms, total: 5.18 s\n",
      "Wall time: 5.18 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Question*: why can't this classify anything?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lost in all those norms? The authors from the [group norm paper](https://arxiv.org/pdf/1803.08494.pdf) have you covered:\n",
    "\n",
    "![Various norms](images/norms.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Group norm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=7213)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*From the PyTorch docs:*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`GroupNorm(num_groups, num_channels, eps=1e-5, affine=True)`\n",
    "\n",
    "The input channels are separated into `num_groups` groups, each containing\n",
    "``num_channels / num_groups`` channels. The mean and standard-deviation are calculated\n",
    "separately over the each group. $\\gamma$ and $\\beta$ are learnable\n",
    "per-channel affine transform parameter vectorss of size `num_channels` if\n",
    "`affine` is ``True``.\n",
    "\n",
    "This layer uses statistics computed from input data in both training and\n",
    "evaluation modes.\n",
    "\n",
    "Args:\n",
    "-    num_groups (int): number of groups to separate the channels into\n",
    "-    num_channels (int): number of channels expected in input\n",
    "-    eps: a value added to the denominator for numerical stability. Default: 1e-5\n",
    "-    affine: a boolean value that when set to ``True``, this module\n",
    "        has learnable per-channel affine parameters initialized to ones (for weights)\n",
    "        and zeros (for biases). Default: ``True``.\n",
    "\n",
    "Shape:\n",
    "- Input: `(N, num_channels, *)`\n",
    "- Output: `(N, num_channels, *)` (same shape as input)\n",
    "\n",
    "Examples::\n",
    "\n",
    "    >>> input = torch.randn(20, 6, 10, 10)\n",
    "    >>> # Separate 6 channels into 3 groups\n",
    "    >>> m = nn.GroupNorm(3, 6)\n",
    "    >>> # Separate 6 channels into 6 groups (equivalent with InstanceNorm)\n",
    "    >>> m = nn.GroupNorm(6, 6)\n",
    "    >>> # Put all 6 channels into a single group (equivalent with LayerNorm)\n",
    "    >>> m = nn.GroupNorm(1, 6)\n",
    "    >>> # Activating the module\n",
    "    >>> output = m(input)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fix small batch sizes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What's the problem?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we compute the statistics (mean and std) for a BatchNorm Layer on a small batch, it is possible that we get a standard deviation very close to 0. because there aren't many samples (the variance of one thing is 0. since it's equal to its mean)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=7304)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = DataBunch(*get_dls(train_ds, valid_ds, 2), c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv_layer(ni, nf, ks=3, stride=2, bn=True, **kwargs):\n",
    "    layers = [nn.Conv2d(ni, nf, ks, padding=ks//2, stride=stride, bias=not bn),\n",
    "              GeneralRelu(**kwargs)]\n",
    "    if bn: layers.append(nn.BatchNorm2d(nf, eps=1e-5, momentum=0.1))\n",
    "    return nn.Sequential(*layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.4, conv_layer, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [2.35619296875, tensor(0.1649, device='cuda:0')]\n",
      "valid: [2867.7198, tensor(0.2604, device='cuda:0')]\n",
      "CPU times: user 1min 32s, sys: 835 ms, total: 1min 33s\n",
      "Wall time: 1min 33s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(1, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Running Batch Norm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To solve this problem we introduce a Running BatchNorm that uses smoother running mean and variance for the mean and std."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=7516)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class RunningBatchNorm(nn.Module):\n",
    "    def __init__(self, nf, mom=0.1, eps=1e-5):\n",
    "        super().__init__()\n",
    "        self.mom,self.eps = mom,eps\n",
    "        self.mults = nn.Parameter(torch.ones (nf,1,1))\n",
    "        self.adds = nn.Parameter(torch.zeros(nf,1,1))\n",
    "        self.register_buffer('sums', torch.zeros(1,nf,1,1))\n",
    "        self.register_buffer('sqrs', torch.zeros(1,nf,1,1))\n",
    "        self.register_buffer('batch', tensor(0.))\n",
    "        self.register_buffer('count', tensor(0.))\n",
    "        self.register_buffer('step', tensor(0.))\n",
    "        self.register_buffer('dbias', tensor(0.))\n",
    "\n",
    "    def update_stats(self, x):\n",
    "        bs,nc,*_ = x.shape\n",
    "        self.sums.detach_()\n",
    "        self.sqrs.detach_()\n",
    "        dims = (0,2,3)\n",
    "        s = x.sum(dims, keepdim=True)\n",
    "        ss = (x*x).sum(dims, keepdim=True)\n",
    "        c = self.count.new_tensor(x.numel()/nc)\n",
    "        mom1 = 1 - (1-self.mom)/math.sqrt(bs-1)\n",
    "        self.mom1 = self.dbias.new_tensor(mom1)\n",
    "        self.sums.lerp_(s, self.mom1)\n",
    "        self.sqrs.lerp_(ss, self.mom1)\n",
    "        self.count.lerp_(c, self.mom1)\n",
    "        self.dbias = self.dbias*(1-self.mom1) + self.mom1\n",
    "        self.batch += bs\n",
    "        self.step += 1\n",
    "\n",
    "    def forward(self, x):\n",
    "        if self.training: self.update_stats(x)\n",
    "        sums = self.sums\n",
    "        sqrs = self.sqrs\n",
    "        c = self.count\n",
    "        if self.step<100:\n",
    "            sums = sums / self.dbias\n",
    "            sqrs = sqrs / self.dbias\n",
    "            c    = c    / self.dbias\n",
    "        means = sums/c\n",
    "        vars = (sqrs/c).sub_(means*means)\n",
    "        if bool(self.batch < 20): vars.clamp_min_(0.01)\n",
    "        x = (x-means).div_((vars.add_(self.eps)).sqrt())\n",
    "        return x.mul_(self.mults).add_(self.adds)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv_rbn(ni, nf, ks=3, stride=2, bn=True, **kwargs):\n",
    "    layers = [nn.Conv2d(ni, nf, ks, padding=ks//2, stride=stride, bias=not bn),\n",
    "              GeneralRelu(**kwargs)]\n",
    "    if bn: layers.append(RunningBatchNorm(nf))\n",
    "    return nn.Sequential(*layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.4, conv_rbn, cbs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.157932021484375, tensor(0.9511, device='cuda:0')]\n",
      "valid: [0.0986408935546875, tensor(0.9730, device='cuda:0')]\n",
      "CPU times: user 16.5 s, sys: 1.57 s, total: 18.1 s\n",
      "Wall time: 18.1 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(1, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This solves the small batch size issue!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What can we do in a single epoch?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's see with a decent batch size what result we can get."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 10 video](https://course19.fast.ai/videos/?lesson=10&t=8068)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = DataBunch(*get_dls(train_ds, valid_ds, 32), c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn,run = get_learn_run(nfs, data, 0.9, conv_rbn, cbs=cbfs\n",
    "                          +[partial(ParamScheduler,'lr', sched_lin(1., 0.2))])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.1573110546875, tensor(0.9521, device='cuda:0')]\n",
      "valid: [0.09242745971679688, tensor(0.9818, device='cuda:0')]\n",
      "CPU times: user 16.6 s, sys: 1.52 s, total: 18.1 s\n",
      "Wall time: 18.2 s\n"
     ]
    }
   ],
   "source": [
    "%time run.fit(1, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Export"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "IPython.notebook.kernel.execute('!./notebook2script.py  ' + IPython.notebook.notebook_name )"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nb_auto_export()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
